Translate inventory parity tests

This commit is contained in:
2026-08-08 20:54:02 +02:00
parent a78f9fba76
commit d7d12957e6
16 changed files with 2895 additions and 1194 deletions

View File

@@ -60,8 +60,8 @@ The current workspace is a structural baseline, not a working client:
members with real fields/constants/enum values and standardized failing
bodies;
- all 1,289 real NUnit `[Test]`/`[TestCase]` invocations have stable catalog
entries; 455 are translated, 11 live-grid cases and four benchmarks are
reviewed, and 819 remain pending without executable placeholder tests;
entries; 488 are translated, 18 live-grid cases and four benchmarks are
reviewed, and 779 remain pending without executable placeholder tests;
- all nine sample/tool projects have compiling Rust binary targets;
- the 128 TestClient command source files are retained as a command inventory.
@@ -334,8 +334,8 @@ markers in hand-written Rust files, so regeneration records unresolved cases
without creating fake executable tests and fails on body drift. The checked-in
audit reports pending, translated, ignored-live, benchmark, drifted, missing,
duplicate, stale, and unreviewed cases. The initial handover contained 1,289
unreviewed cases; the current ledger contains 455 translated, 11 reviewed
live-grid cases, four benchmark-reviewed, and 819 pending cases.
unreviewed cases; the current ledger contains 488 translated, 18 reviewed
live-grid cases, four benchmark-reviewed, and 779 pending cases.
The Rust tests must call the public APIs rather than internal replacements.
Where the C# tests call internal members through friend-assembly access, record

View File

@@ -47,7 +47,7 @@ External member APIs are not copied. Each signature type resolves to Rust core/s
- Properties/indexers/events: **5,090 / 11 / 268**
- Delegates and flags enums: **40 / 46**
- Optional/ref/out/in parameters: **470 / 6,144 / 555 / 0**
- Async Rust signatures: **330**
- Async Rust signatures: **328**
- Descriptively renamed overloads: **7,151**
- Explicit CLR delegate APM differences: **80**

View File

@@ -11783,28 +11783,28 @@ M:LibreMetaverse.Interfaces.IByteBufferPool.LeaseBytes(System.Int32) method Syst
M:LibreMetaverse.Interfaces.IByteBufferPool.ReturnBytes(System.Byte[]) method System.Void LibreMetaverse.Interfaces.IByteBufferPool.ReturnBytes(System.Byte[] bytes) libremetaverse interfaces libremetaverse::interfaces::IByteBufferPool::return_bytes pub fn return_bytes(&self, bytes: Vec<u8>) -> Result<(), crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Interfaces.IMessage.Deserialize(LibreMetaverse.StructuredData.OSDMap) method System.Void LibreMetaverse.Interfaces.IMessage.Deserialize(LibreMetaverse.StructuredData.OSDMap map) libremetaverse interfaces libremetaverse::interfaces::IMessage::deserialize pub fn deserialize(&mut self, map: libremetaverse_structured_data::OSDMap) -> Result<(), crate::Error> mutable_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Interfaces.IMessage.Serialize method LibreMetaverse.StructuredData.OSDMap LibreMetaverse.Interfaces.IMessage.Serialize() libremetaverse interfaces libremetaverse::interfaces::IMessage::serialize pub fn serialize(&self) -> Result<libremetaverse_structured_data::OSDMap, crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Inventory.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.Inventory(LibreMetaverse.GridClient client) libremetaverse libremetaverse::Inventory::new_with_grid_client pub fn new_with_grid_client(client: libremetaverse::GridClient) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.#ctor(LibreMetaverse.GridClient,LibreMetaverse.UUID) constructor LibreMetaverse.Inventory(LibreMetaverse.GridClient client, LibreMetaverse.UUID owner) libremetaverse libremetaverse::Inventory::new_with_grid_client_uuid pub fn new_with_grid_client_uuid(client: libremetaverse::GridClient, owner: libremetaverse_types::UUID) -> Result<Self, crate::Error> owned,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.Inventory(LibreMetaverse.GridClient client) libremetaverse libremetaverse::Inventory::new_with_grid_client pub fn new_with_grid_client(client: std::sync::Arc<libremetaverse::GridClient>) -> Result<Self, crate::Error> shared sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.#ctor(LibreMetaverse.GridClient,LibreMetaverse.UUID) constructor LibreMetaverse.Inventory(LibreMetaverse.GridClient client, LibreMetaverse.UUID owner) libremetaverse libremetaverse::Inventory::new_with_grid_client_uuid pub fn new_with_grid_client_uuid(client: std::sync::Arc<libremetaverse::GridClient>, owner: libremetaverse_types::UUID) -> Result<Self, crate::Error> shared,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.Clear method System.Void LibreMetaverse.Inventory.Clear() libremetaverse libremetaverse::Inventory::clear pub fn clear(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Inventory.Contains(LibreMetaverse.InventoryBase) method System.Boolean LibreMetaverse.Inventory.Contains(LibreMetaverse.InventoryBase obj) libremetaverse libremetaverse::Inventory::contains_with_inventory_base pub fn contains_with_inventory_base(&self, obj: libremetaverse::InventoryBase) -> Result<bool, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.Contains(LibreMetaverse.InventoryBase) method System.Boolean LibreMetaverse.Inventory.Contains(LibreMetaverse.InventoryBase obj) libremetaverse libremetaverse::Inventory::contains_with_inventory_base pub fn contains_with_inventory_base(&self, obj: &dyn libremetaverse::InventoryObjectClass) -> Result<bool, crate::Error> shared_self,shared_borrow sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.Contains(LibreMetaverse.UUID) method System.Boolean LibreMetaverse.Inventory.Contains(LibreMetaverse.UUID uuid) libremetaverse libremetaverse::Inventory::contains_with_uuid pub fn contains_with_uuid(&self, uuid: libremetaverse_types::UUID) -> Result<bool, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.FindAllLinks(LibreMetaverse.UUID) method System.Collections.Generic.List<LibreMetaverse.InventoryNode> LibreMetaverse.Inventory.FindAllLinks(LibreMetaverse.UUID assetId) libremetaverse libremetaverse::Inventory::find_all_links pub fn find_all_links(&self, asset_id: libremetaverse_types::UUID) -> Result<Vec<libremetaverse::InventoryNode>, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Inventory.GetContents(LibreMetaverse.InventoryFolder) method System.Collections.Generic.List<LibreMetaverse.InventoryBase> LibreMetaverse.Inventory.GetContents(LibreMetaverse.InventoryFolder folder) libremetaverse libremetaverse::Inventory::get_contents_with_inventory_folder pub fn get_contents_with_inventory_folder(&self, folder: libremetaverse::InventoryFolder) -> Result<Vec<libremetaverse::InventoryBase>, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.GetContents(LibreMetaverse.UUID) method System.Collections.Generic.List<LibreMetaverse.InventoryBase> LibreMetaverse.Inventory.GetContents(LibreMetaverse.UUID folder) libremetaverse libremetaverse::Inventory::get_contents_with_uuid pub fn get_contents_with_uuid(&self, folder: libremetaverse_types::UUID) -> Result<Vec<libremetaverse::InventoryBase>, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.GetContents(LibreMetaverse.InventoryFolder) method System.Collections.Generic.List<LibreMetaverse.InventoryBase> LibreMetaverse.Inventory.GetContents(LibreMetaverse.InventoryFolder folder) libremetaverse libremetaverse::Inventory::get_contents_with_inventory_folder pub fn get_contents_with_inventory_folder(&self, folder: &libremetaverse::InventoryFolder) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> shared_self,shared_borrow sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.GetContents(LibreMetaverse.UUID) method System.Collections.Generic.List<LibreMetaverse.InventoryBase> LibreMetaverse.Inventory.GetContents(LibreMetaverse.UUID folder) libremetaverse libremetaverse::Inventory::get_contents_with_uuid pub fn get_contents_with_uuid(&self, folder: libremetaverse_types::UUID) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.GetNodeFor(LibreMetaverse.UUID) method LibreMetaverse.InventoryNode LibreMetaverse.Inventory.GetNodeFor(LibreMetaverse.UUID uuid) libremetaverse libremetaverse::Inventory::get_node_for pub fn get_node_for(&self, uuid: libremetaverse_types::UUID) -> Result<libremetaverse::InventoryNode, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Inventory.GetNodeOrDefault(LibreMetaverse.UUID) method LibreMetaverse.InventoryNode LibreMetaverse.Inventory.GetNodeOrDefault(LibreMetaverse.UUID uuid) libremetaverse libremetaverse::Inventory::get_node_or_default pub fn get_node_or_default(&self, uuid: libremetaverse_types::UUID) -> Result<Option<libremetaverse::InventoryNode>, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Inventory.GetValueOrDefault(LibreMetaverse.UUID) method LibreMetaverse.InventoryBase LibreMetaverse.Inventory.GetValueOrDefault(LibreMetaverse.UUID uuid) libremetaverse libremetaverse::Inventory::get_value_or_default_with_uuid pub fn get_value_or_default_with_uuid(&self, uuid: libremetaverse_types::UUID) -> Result<Option<libremetaverse::InventoryBase>, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.GetValueOrDefault``1(LibreMetaverse.UUID) method T LibreMetaverse.Inventory.GetValueOrDefault(LibreMetaverse.UUID uuid) libremetaverse libremetaverse::Inventory::get_value_or_default_with_uuid_a7c63fbe pub fn get_value_or_default_with_uuid_a7c63fbe<T>(&self, uuid: libremetaverse_types::UUID) -> Result<Option<T>, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name_with_stable_id method mapped
M:LibreMetaverse.Inventory.RemoveNodeFor(LibreMetaverse.InventoryBase) method System.Void LibreMetaverse.Inventory.RemoveNodeFor(LibreMetaverse.InventoryBase item) libremetaverse libremetaverse::Inventory::remove_node_for pub fn remove_node_for(&self, item: libremetaverse::InventoryBase) -> Result<(), crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Inventory.RemoveNodeFor(LibreMetaverse.InventoryBase) method System.Void LibreMetaverse.Inventory.RemoveNodeFor(LibreMetaverse.InventoryBase item) libremetaverse libremetaverse::Inventory::remove_node_for pub fn remove_node_for(&self, item: &dyn libremetaverse::InventoryObjectClass) -> Result<(), crate::Error> shared_self,shared_borrow sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Inventory.RestoreFromDisk(System.String) method System.Int32 LibreMetaverse.Inventory.RestoreFromDisk(System.String filename) libremetaverse libremetaverse::Inventory::restore_from_disk_with_string pub fn restore_from_disk_with_string(&self, filename: String) -> Result<i32, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.RestoreFromDiskAsync(System.String,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Int32> LibreMetaverse.Inventory.RestoreFromDiskAsync(System.String filename, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::Inventory::restore_from_disk_with_string_cancellation_token pub async fn restore_from_disk_with_string_cancellation_token(&self, filename: String, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<i32, crate::Error> shared_self,owned,optional_owned async Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.SaveToDisk(System.String) method System.Void LibreMetaverse.Inventory.SaveToDisk(System.String filename) libremetaverse libremetaverse::Inventory::save_to_disk_with_string pub fn save_to_disk_with_string(&self, filename: String) -> Result<(), crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.SaveToDiskAsync(System.String,System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.Inventory.SaveToDiskAsync(System.String filename, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::Inventory::save_to_disk_with_string_cancellation_token pub async fn save_to_disk_with_string_cancellation_token(&self, filename: String, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,owned,optional_owned async Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.TryGetNodeFor(LibreMetaverse.UUID,LibreMetaverse.InventoryNode@) method System.Boolean LibreMetaverse.Inventory.TryGetNodeFor(LibreMetaverse.UUID uuid, out LibreMetaverse.InventoryNode& node) libremetaverse libremetaverse::Inventory::try_get_node_for pub fn try_get_node_for(&self, uuid: libremetaverse_types::UUID, node: &mut Option<libremetaverse::InventoryNode>) -> bool shared_self,owned,mutable_output sync infallible_placeholder direct_snake_case method mapped
M:LibreMetaverse.Inventory.TryGetValue(LibreMetaverse.UUID,LibreMetaverse.InventoryBase@) method System.Boolean LibreMetaverse.Inventory.TryGetValue(LibreMetaverse.UUID uuid, out LibreMetaverse.InventoryBase& item) libremetaverse libremetaverse::Inventory::try_get_value_with_uuid_inventory_base pub fn try_get_value_with_uuid_inventory_base(&self, uuid: libremetaverse_types::UUID, item: &mut Option<libremetaverse::InventoryBase>) -> bool shared_self,owned,mutable_output sync infallible_placeholder descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.TryGetValue(LibreMetaverse.UUID,LibreMetaverse.InventoryBase@) method System.Boolean LibreMetaverse.Inventory.TryGetValue(LibreMetaverse.UUID uuid, out LibreMetaverse.InventoryBase& item) libremetaverse libremetaverse::Inventory::try_get_value_with_uuid_inventory_base pub fn try_get_value_with_uuid_inventory_base(&self, uuid: libremetaverse_types::UUID, item: &mut Option<Box<dyn libremetaverse::InventoryObjectClass>>) -> Result<bool, crate::Error> shared_self,owned,mutable_output sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.TryGetValue``1(LibreMetaverse.UUID,``0@) method System.Boolean LibreMetaverse.Inventory.TryGetValue(LibreMetaverse.UUID uuid, out T& item) libremetaverse libremetaverse::Inventory::try_get_value_with_uuid_t pub fn try_get_value_with_uuid_t<T>(&self, uuid: libremetaverse_types::UUID, item: &mut Option<T>) -> bool shared_self,owned,mutable_output sync infallible_placeholder descriptive_overload_name method mapped
M:LibreMetaverse.Inventory.UpdateNodeFor(LibreMetaverse.InventoryBase) method System.Void LibreMetaverse.Inventory.UpdateNodeFor(LibreMetaverse.InventoryBase item) libremetaverse libremetaverse::Inventory::update_node_for pub fn update_node_for(&self, item: libremetaverse::InventoryBase) -> Result<(), crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.InventoryAISClient(LibreMetaverse.GridClient client) libremetaverse libremetaverse::InventoryAISClient::new pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Inventory.UpdateNodeFor(LibreMetaverse.InventoryBase) method System.Void LibreMetaverse.Inventory.UpdateNodeFor(LibreMetaverse.InventoryBase item) libremetaverse libremetaverse::Inventory::update_node_for pub fn update_node_for(&self, item: &dyn libremetaverse::InventoryObjectClass) -> Result<(), crate::Error> shared_self,shared_borrow sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.InventoryAISClient(LibreMetaverse.GridClient client) libremetaverse libremetaverse::InventoryAISClient::new pub fn new(client: Option<std::sync::Arc<libremetaverse::GridClient>>) -> Result<Self, crate::Error> optional_shared sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.CopyCategoryAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.InventoryAISClient.CopyCategoryAsync(LibreMetaverse.UUID sourceUuid, LibreMetaverse.UUID destUuid, System.Boolean simulate = default, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryAISClient::copy_category pub async fn copy_category(&self, source_uuid: libremetaverse_types::UUID, dest_uuid: libremetaverse_types::UUID, simulate: Option<bool>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,owned,optional_owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.CopyCategoryChildrenAsync(System.String,LibreMetaverse.UUID,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.InventoryAISClient.CopyCategoryChildrenAsync(System.String category, LibreMetaverse.UUID destUuid, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryAISClient::copy_category_children pub async fn copy_category_children(&self, category: String, dest_uuid: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.CopyCategoryLinksAsync(System.String,LibreMetaverse.UUID,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.InventoryAISClient.CopyCategoryLinksAsync(System.String category, LibreMetaverse.UUID destUuid, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryAISClient::copy_category_links pub async fn copy_category_links(&self, category: String, dest_uuid: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
@@ -11827,10 +11827,10 @@ M:LibreMetaverse.InventoryAISClient.MoveCategoryChildrenAsync(System.String,Libr
M:LibreMetaverse.InventoryAISClient.MoveCategoryLinksAsync(System.String,LibreMetaverse.UUID,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.InventoryAISClient.MoveCategoryLinksAsync(System.String category, LibreMetaverse.UUID destUuid, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryAISClient::move_category_links pub async fn move_category_links(&self, category: String, dest_uuid: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.MoveItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.InventoryAISClient.MoveItemAsync(LibreMetaverse.UUID itemUuid, LibreMetaverse.UUID destUuid, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryAISClient::move_item pub async fn move_item(&self, item_uuid: libremetaverse_types::UUID, dest_uuid: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.ParseAISResponseMeta(LibreMetaverse.StructuredData.OSDMap) method LibreMetaverse.AISResponseMeta LibreMetaverse.InventoryAISClient.ParseAISResponseMeta(LibreMetaverse.StructuredData.OSDMap response) libremetaverse libremetaverse::InventoryAISClient::parse_ais_response_meta pub fn parse_ais_response_meta(response: Option<libremetaverse_structured_data::OSDMap>) -> Result<libremetaverse::AISResponseMeta, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.ParseEmbedded(LibreMetaverse.StructuredData.OSDMap,System.Collections.Generic.List{LibreMetaverse.InventoryFolder}@,System.Collections.Generic.List{LibreMetaverse.InventoryItem}@,System.Collections.Generic.List{LibreMetaverse.InventoryItem}@) method System.Void LibreMetaverse.InventoryAISClient.ParseEmbedded(LibreMetaverse.StructuredData.OSDMap response, out System.Collections.Generic.List<LibreMetaverse.InventoryFolder>& folders, out System.Collections.Generic.List<LibreMetaverse.InventoryItem>& items, out System.Collections.Generic.List<LibreMetaverse.InventoryItem>& links) libremetaverse libremetaverse::InventoryAISClient::parse_embedded pub fn parse_embedded(&self, response: libremetaverse_structured_data::OSDMap, folders: &mut Vec<libremetaverse::InventoryFolder>, items: &mut Vec<libremetaverse::InventoryItem>, links: &mut Vec<libremetaverse::InventoryItem>) -> Result<(), crate::Error> shared_self,owned,mutable_output,mutable_output,mutable_output sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.ParseEmbedded(LibreMetaverse.StructuredData.OSDMap,System.Collections.Generic.List{LibreMetaverse.InventoryFolder}@,System.Collections.Generic.List{LibreMetaverse.InventoryItem}@,System.Collections.Generic.List{LibreMetaverse.InventoryItem}@) method System.Void LibreMetaverse.InventoryAISClient.ParseEmbedded(LibreMetaverse.StructuredData.OSDMap response, out System.Collections.Generic.List<LibreMetaverse.InventoryFolder>& folders, out System.Collections.Generic.List<LibreMetaverse.InventoryItem>& items, out System.Collections.Generic.List<LibreMetaverse.InventoryItem>& links) libremetaverse libremetaverse::InventoryAISClient::parse_embedded pub fn parse_embedded(&self, response: libremetaverse_structured_data::OSD, folders: &mut Option<Vec<libremetaverse::InventoryFolder>>, items: &mut Option<Vec<libremetaverse::InventoryItem>>, links: &mut Option<Vec<libremetaverse::InventoryItem>>) -> Result<(), crate::Error> shared_self,owned,mutable_output,mutable_output,mutable_output sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.ParseFoldersFromEmbedded(LibreMetaverse.StructuredData.OSDMap) method System.Collections.Generic.List<LibreMetaverse.InventoryFolder> LibreMetaverse.InventoryAISClient.ParseFoldersFromEmbedded(LibreMetaverse.StructuredData.OSDMap response) libremetaverse libremetaverse::InventoryAISClient::parse_folders_from_embedded pub fn parse_folders_from_embedded(&self, response: libremetaverse_structured_data::OSDMap) -> Result<Vec<libremetaverse::InventoryFolder>, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.ParseItemsFromEmbedded(LibreMetaverse.StructuredData.OSDMap) method System.Collections.Generic.List<LibreMetaverse.InventoryItem> LibreMetaverse.InventoryAISClient.ParseItemsFromEmbedded(LibreMetaverse.StructuredData.OSDMap response) libremetaverse libremetaverse::InventoryAISClient::parse_items_from_embedded pub fn parse_items_from_embedded(&self, response: libremetaverse_structured_data::OSDMap) -> Result<Vec<libremetaverse::InventoryItem>, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.ParseLinksFromEmbedded(LibreMetaverse.StructuredData.OSDMap) method System.Collections.Generic.List<LibreMetaverse.InventoryItem> LibreMetaverse.InventoryAISClient.ParseLinksFromEmbedded(LibreMetaverse.StructuredData.OSDMap response) libremetaverse libremetaverse::InventoryAISClient::parse_links_from_embedded pub fn parse_links_from_embedded(&self, response: libremetaverse_structured_data::OSDMap) -> Result<Vec<libremetaverse::InventoryItem>, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.ParseItemsFromEmbedded(LibreMetaverse.StructuredData.OSDMap) method System.Collections.Generic.List<LibreMetaverse.InventoryItem> LibreMetaverse.InventoryAISClient.ParseItemsFromEmbedded(LibreMetaverse.StructuredData.OSDMap response) libremetaverse libremetaverse::InventoryAISClient::parse_items_from_embedded pub fn parse_items_from_embedded(&self, response: Option<libremetaverse_structured_data::OSD>) -> Result<Vec<libremetaverse::InventoryItem>, crate::Error> shared_self,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.ParseLinksFromEmbedded(LibreMetaverse.StructuredData.OSDMap) method System.Collections.Generic.List<LibreMetaverse.InventoryItem> LibreMetaverse.InventoryAISClient.ParseLinksFromEmbedded(LibreMetaverse.StructuredData.OSDMap response) libremetaverse libremetaverse::InventoryAISClient::parse_links_from_embedded pub fn parse_links_from_embedded(&self, response: Option<libremetaverse_structured_data::OSD>) -> Result<Vec<libremetaverse::InventoryItem>, crate::Error> shared_self,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.PurgeDescendentsAsync(LibreMetaverse.UUID,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.InventoryAISClient.PurgeDescendentsAsync(LibreMetaverse.UUID categoryUuid, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryAISClient::purge_descendents pub async fn purge_descendents(&self, category_uuid: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.PutCategoryChildrenAsync(System.String,LibreMetaverse.StructuredData.OSD,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.InventoryAISClient.PutCategoryChildrenAsync(System.String category, LibreMetaverse.StructuredData.OSD childrenPayload, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryAISClient::put_category_children pub async fn put_category_children(&self, category: String, children_payload: libremetaverse_structured_data::OSD, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryAISClient.PutCategoryLinksAsync(System.String,LibreMetaverse.StructuredData.OSD,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.InventoryAISClient.PutCategoryLinksAsync(System.String category, LibreMetaverse.StructuredData.OSD linksPayload, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryAISClient::put_category_links pub async fn put_category_links(&self, category: String, links_payload: libremetaverse_structured_data::OSD, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
@@ -11873,14 +11873,14 @@ M:LibreMetaverse.InventoryItem.ToString method System.String LibreMetaverse.Inve
M:LibreMetaverse.InventoryItem.Update(LibreMetaverse.StructuredData.OSDMap) method System.Void LibreMetaverse.InventoryItem.Update(LibreMetaverse.StructuredData.OSDMap data) libremetaverse libremetaverse::InventoryItem::update pub fn update(&self, data: libremetaverse_structured_data::OSDMap) -> Result<(), crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryLSL.#ctor(LibreMetaverse.UUID) constructor LibreMetaverse.InventoryLSL(LibreMetaverse.UUID UUID) libremetaverse libremetaverse::InventoryLSL::new pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryLandmark.#ctor(LibreMetaverse.UUID) constructor LibreMetaverse.InventoryLandmark(LibreMetaverse.UUID UUID) libremetaverse libremetaverse::InventoryLandmark::new pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.InventoryManager(LibreMetaverse.GridClient client) libremetaverse libremetaverse::InventoryManager::new pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.InventoryManager(LibreMetaverse.GridClient client) libremetaverse libremetaverse::InventoryManager::new pub fn new(client: Option<std::sync::Arc<libremetaverse::GridClient>>) -> Result<Self, crate::Error> optional_shared sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.CopyItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,LibreMetaverse.UUID,System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.InventoryBase> LibreMetaverse.InventoryManager.CopyItemAsync(LibreMetaverse.UUID item, LibreMetaverse.UUID newParent, System.String newName, LibreMetaverse.UUID oldOwnerID, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::copy_item_with_uuid_uuid_string_uuid_cancellation_token pub async fn copy_item_with_uuid_uuid_string_uuid_cancellation_token(&self, item: libremetaverse_types::UUID, new_parent: libremetaverse_types::UUID, new_name: String, old_owner_id: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Option<libremetaverse::InventoryBase>, crate::Error> shared_self,owned,owned,owned,owned,optional_owned async Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryManager.CopyItemAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.InventoryBase> LibreMetaverse.InventoryManager.CopyItemAsync(LibreMetaverse.UUID item, LibreMetaverse.UUID newParent, System.String newName, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::copy_item_with_uuid_uuid_string_cancellation_token pub async fn copy_item_with_uuid_uuid_string_cancellation_token(&self, item: libremetaverse_types::UUID, new_parent: libremetaverse_types::UUID, new_name: String, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Option<libremetaverse::InventoryBase>, crate::Error> shared_self,owned,owned,owned,optional_owned async Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryManager.CopyItemsResult.#ctor constructor LibreMetaverse.InventoryManager.CopyItemsResult() libremetaverse libremetaverse::InventoryManagerCopyItemsResult::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.CopyScriptToTask(System.UInt32,LibreMetaverse.InventoryItem,System.Boolean,LibreMetaverse.Simulator) method LibreMetaverse.UUID LibreMetaverse.InventoryManager.CopyScriptToTask(System.UInt32 objectLocalID, LibreMetaverse.InventoryItem item, System.Boolean enableScript, LibreMetaverse.Simulator simulator = default) libremetaverse libremetaverse::InventoryManager::copy_script_to_task pub fn copy_script_to_task(&self, object_local_id: u32, item: libremetaverse::InventoryItem, enable_script: bool, simulator: Option<libremetaverse::Simulator>) -> Result<libremetaverse_types::UUID, crate::Error> shared_self,owned,owned,owned,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.CreateFolder(LibreMetaverse.UUID,System.String) method LibreMetaverse.UUID LibreMetaverse.InventoryManager.CreateFolder(LibreMetaverse.UUID parentID, System.String name) libremetaverse libremetaverse::InventoryManager::create_folder_with_uuid_string pub fn create_folder_with_uuid_string(&self, parent_id: libremetaverse_types::UUID, name: String) -> Result<libremetaverse_types::UUID, crate::Error> shared_self,owned,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryManager.CreateFolder(LibreMetaverse.UUID,System.String,LibreMetaverse.FolderType) method LibreMetaverse.UUID LibreMetaverse.InventoryManager.CreateFolder(LibreMetaverse.UUID parentID, System.String name, LibreMetaverse.FolderType preferredType) libremetaverse libremetaverse::InventoryManager::create_folder_with_uuid_string_folder_type pub fn create_folder_with_uuid_string_folder_type(&self, parent_id: libremetaverse_types::UUID, name: String, preferred_type: libremetaverse_types::FolderType) -> Result<libremetaverse_types::UUID, crate::Error> shared_self,owned,owned,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryManager.CreateInventoryItem(LibreMetaverse.InventoryType,LibreMetaverse.UUID) method LibreMetaverse.InventoryItem LibreMetaverse.InventoryManager.CreateInventoryItem(LibreMetaverse.InventoryType type, LibreMetaverse.UUID id) libremetaverse libremetaverse::InventoryManager::create_inventory_item pub fn create_inventory_item(type_: libremetaverse_types::InventoryType, id: libremetaverse_types::UUID) -> Result<libremetaverse::InventoryItem, crate::Error> owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.CreateInventoryItem(LibreMetaverse.InventoryType,LibreMetaverse.UUID) method LibreMetaverse.InventoryItem LibreMetaverse.InventoryManager.CreateInventoryItem(LibreMetaverse.InventoryType type, LibreMetaverse.UUID id) libremetaverse libremetaverse::InventoryManager::create_inventory_item pub fn create_inventory_item(type_: libremetaverse_types::InventoryType, id: libremetaverse_types::UUID) -> Result<Box<dyn libremetaverse::InventoryItemClass>, crate::Error> owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.CreateItemAsync(LibreMetaverse.UUID,System.String,System.String,LibreMetaverse.AssetType,LibreMetaverse.UUID,LibreMetaverse.InventoryType,LibreMetaverse.PermissionMask,System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.InventoryItem> LibreMetaverse.InventoryManager.CreateItemAsync(LibreMetaverse.UUID parentFolder, System.String name, System.String description, LibreMetaverse.AssetType type, LibreMetaverse.UUID assetTransactionID, LibreMetaverse.InventoryType invType, LibreMetaverse.PermissionMask nextOwnerMask, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::create_item_with_uuid_string_string_asset_type_uuid_inventory_type_permission_mask_cancellation_token pub async fn create_item_with_uuid_string_string_asset_type_uuid_inventory_type_permission_mask_cancellation_token(&self, parent_folder: libremetaverse_types::UUID, name: String, description: String, type_: libremetaverse_types::AssetType, asset_transaction_id: libremetaverse_types::UUID, inv_type: libremetaverse_types::InventoryType, next_owner_mask: libremetaverse::PermissionMask, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Option<libremetaverse::InventoryItem>, crate::Error> shared_self,owned,owned,owned,owned,owned,owned,owned,optional_owned async Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryManager.CreateItemAsync(LibreMetaverse.UUID,System.String,System.String,LibreMetaverse.AssetType,LibreMetaverse.UUID,LibreMetaverse.InventoryType,LibreMetaverse.WearableType,LibreMetaverse.PermissionMask,System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.InventoryItem> LibreMetaverse.InventoryManager.CreateItemAsync(LibreMetaverse.UUID parentFolder, System.String name, System.String description, LibreMetaverse.AssetType type, LibreMetaverse.UUID assetTransactionID, LibreMetaverse.InventoryType invType, LibreMetaverse.WearableType wearableType, LibreMetaverse.PermissionMask nextOwnerMask, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::create_item_with_uuid_string_string_asset_type_uuid_inventory_type_wearable_type_permission_mask_cancellation_token pub async fn create_item_with_uuid_string_string_asset_type_uuid_inventory_type_wearable_type_permission_mask_cancellation_token(&self, parent_folder: libremetaverse_types::UUID, name: String, description: String, type_: libremetaverse_types::AssetType, asset_transaction_id: libremetaverse_types::UUID, inv_type: libremetaverse_types::InventoryType, wearable_type: libremetaverse_types::WearableType, next_owner_mask: libremetaverse::PermissionMask, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Option<libremetaverse::InventoryItem>, crate::Error> shared_self,owned,owned,owned,owned,owned,owned,owned,owned,optional_owned async Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryManager.CreateItemFromAssetAsync(System.Byte[],System.String,System.String,LibreMetaverse.AssetType,LibreMetaverse.InventoryType,LibreMetaverse.UUID,LibreMetaverse.Permissions,System.Threading.CancellationToken,System.IProgress{LibreMetaverse.HttpCapsClient.ProgressReport}) method System.Threading.Tasks.Task<LibreMetaverse.InventoryManager.CreateItemFromAssetResult> LibreMetaverse.InventoryManager.CreateItemFromAssetAsync(System.Byte[] data, System.String name, System.String description, LibreMetaverse.AssetType assetType, LibreMetaverse.InventoryType invType, LibreMetaverse.UUID folderID, LibreMetaverse.Permissions permissions, System.Threading.CancellationToken cancellationToken = default, System.IProgress<LibreMetaverse.HttpCapsClient.ProgressReport> progress = default) libremetaverse libremetaverse::InventoryManager::create_item_from_asset pub async fn create_item_from_asset(&self, data: Vec<u8>, name: String, description: String, asset_type: libremetaverse_types::AssetType, inv_type: libremetaverse_types::InventoryType, folder_id: libremetaverse_types::UUID, permissions: libremetaverse::Permissions, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>, progress: Option<Box<dyn libremetaverse_types::compat::IProgress<libremetaverse::HttpCapsClientProgressReport>>>) -> Result<libremetaverse::InventoryManagerCreateItemFromAssetResult, crate::Error> shared_self,owned,owned,owned,owned,owned,owned,owned,optional_owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
@@ -11900,13 +11900,13 @@ M:LibreMetaverse.InventoryManager.FetchItemHttpAsync(LibreMetaverse.UUID,LibreMe
M:LibreMetaverse.InventoryManager.FindFolderForType(LibreMetaverse.AssetType) method LibreMetaverse.UUID LibreMetaverse.InventoryManager.FindFolderForType(LibreMetaverse.AssetType type) libremetaverse libremetaverse::InventoryManager::find_folder_for_type_with_asset_type pub fn find_folder_for_type_with_asset_type(&self, type_: libremetaverse_types::AssetType) -> Result<libremetaverse_types::UUID, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryManager.FindFolderForType(LibreMetaverse.FolderType) method LibreMetaverse.UUID LibreMetaverse.InventoryManager.FindFolderForType(LibreMetaverse.FolderType type) libremetaverse libremetaverse::InventoryManager::find_folder_for_type_with_folder_type pub fn find_folder_for_type_with_folder_type(&self, type_: libremetaverse_types::FolderType) -> Result<libremetaverse_types::UUID, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryManager.FindObjectByPathAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.String,System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.UUID> LibreMetaverse.InventoryManager.FindObjectByPathAsync(LibreMetaverse.UUID baseFolder, LibreMetaverse.UUID inventoryOwner, System.String path, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::find_object_by_path pub async fn find_object_by_path(&self, base_folder: libremetaverse_types::UUID, inventory_owner: libremetaverse_types::UUID, path: String, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<libremetaverse_types::UUID, crate::Error> shared_self,owned,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken,System.Boolean) method System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID folder, LibreMetaverse.UUID owner, System.Boolean fetchFolders, System.Boolean fetchItems, LibreMetaverse.InventorySortOrder order, System.Threading.CancellationToken cancellationToken = default, System.Boolean followLinks = default) libremetaverse libremetaverse::InventoryManager::folder_contents pub async fn folder_contents(&self, folder: libremetaverse_types::UUID, owner: libremetaverse_types::UUID, fetch_folders: bool, fetch_items: bool, order: libremetaverse::InventorySortOrder, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>, follow_links: Option<bool>) -> Result<Vec<libremetaverse::InventoryBase>, crate::Error> shared_self,owned,owned,owned,owned,owned,optional_owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken,System.Boolean) method System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID folder, LibreMetaverse.UUID owner, System.Boolean fetchFolders, System.Boolean fetchItems, LibreMetaverse.InventorySortOrder order, System.Threading.CancellationToken cancellationToken = default, System.Boolean followLinks = default) libremetaverse libremetaverse::InventoryManager::folder_contents pub async fn folder_contents(&self, folder: libremetaverse_types::UUID, owner: libremetaverse_types::UUID, fetch_folders: bool, fetch_items: bool, order: libremetaverse::InventorySortOrder, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>, follow_links: Option<bool>) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> shared_self,owned,owned,owned,owned,owned,optional_owned,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.FolderUpdateResult.#ctor constructor LibreMetaverse.InventoryManager.FolderUpdateResult() libremetaverse libremetaverse::InventoryManagerFolderUpdateResult::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.GetInventoryRecursiveAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Collections.Generic.List{LibreMetaverse.InventoryFolder},System.Collections.Generic.List{LibreMetaverse.InventoryItem},System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.InventoryManager.GetInventoryRecursiveAsync(LibreMetaverse.UUID folderID, LibreMetaverse.UUID owner, System.Collections.Generic.List<LibreMetaverse.InventoryFolder> cats, System.Collections.Generic.List<LibreMetaverse.InventoryItem> items, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::get_inventory_recursive pub async fn get_inventory_recursive(&self, folder_id: libremetaverse_types::UUID, owner: libremetaverse_types::UUID, cats: Vec<libremetaverse::InventoryFolder>, items: Vec<libremetaverse::InventoryItem>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,owned,owned,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID,System.UInt32,LibreMetaverse.Simulator,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID objectID, System.UInt32 objectLocalID, LibreMetaverse.Simulator simulator = default, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::get_task_inventory pub async fn get_task_inventory(&self, object_id: libremetaverse_types::UUID, object_local_id: u32, simulator: Option<libremetaverse::Simulator>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Vec<libremetaverse::InventoryBase>, crate::Error> shared_self,owned,owned,optional_owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID,System.UInt32,LibreMetaverse.Simulator,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID objectID, System.UInt32 objectLocalID, LibreMetaverse.Simulator simulator = default, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::get_task_inventory pub async fn get_task_inventory(&self, object_id: libremetaverse_types::UUID, object_local_id: u32, simulator: Option<libremetaverse::Simulator>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> shared_self,owned,owned,optional_owned,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.GiveFolderAsync(LibreMetaverse.UUID,System.String,LibreMetaverse.UUID,System.Boolean,System.Threading.CancellationToken) method System.Threading.Tasks.Task LibreMetaverse.InventoryManager.GiveFolderAsync(LibreMetaverse.UUID folderID, System.String folderName, LibreMetaverse.UUID recipient, System.Boolean doEffect, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::give_folder pub async fn give_folder(&self, folder_id: libremetaverse_types::UUID, folder_name: String, recipient: libremetaverse_types::UUID, do_effect: bool, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,owned,owned,owned,owned,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.GiveItem(LibreMetaverse.UUID,System.String,LibreMetaverse.AssetType,LibreMetaverse.UUID,System.Boolean) method System.Void LibreMetaverse.InventoryManager.GiveItem(LibreMetaverse.UUID itemID, System.String itemName, LibreMetaverse.AssetType assetType, LibreMetaverse.UUID recipient, System.Boolean doEffect) libremetaverse libremetaverse::InventoryManager::give_item pub fn give_item(&self, item_id: libremetaverse_types::UUID, item_name: String, asset_type: libremetaverse_types::AssetType, recipient: libremetaverse_types::UUID, do_effect: bool) -> Result<(), crate::Error> shared_self,owned,owned,owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.ItemCRC(LibreMetaverse.InventoryItem) method System.UInt32 LibreMetaverse.InventoryManager.ItemCRC(LibreMetaverse.InventoryItem iitem) libremetaverse libremetaverse::InventoryManager::item_crc pub fn item_crc(iitem: libremetaverse::InventoryItem) -> Result<u32, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.ItemCRC(LibreMetaverse.InventoryItem) method System.UInt32 LibreMetaverse.InventoryManager.ItemCRC(LibreMetaverse.InventoryItem iitem) libremetaverse libremetaverse::InventoryManager::item_crc pub fn item_crc(iitem: &libremetaverse::InventoryItem) -> Result<u32, crate::Error> shared_borrow sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.LocalFind(LibreMetaverse.UUID,System.String[],System.Int32,System.Boolean) method System.Collections.Generic.List<LibreMetaverse.InventoryBase> LibreMetaverse.InventoryManager.LocalFind(LibreMetaverse.UUID baseFolder, System.String[] path, System.Int32 level, System.Boolean firstOnly) libremetaverse libremetaverse::InventoryManager::local_find pub fn local_find(&self, base_folder: libremetaverse_types::UUID, path: Vec<String>, level: i32, first_only: bool) -> Result<Vec<libremetaverse::InventoryBase>, crate::Error> shared_self,owned,owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.Move(LibreMetaverse.InventoryBase,LibreMetaverse.InventoryFolder) method System.Void LibreMetaverse.InventoryManager.Move(LibreMetaverse.InventoryBase item, LibreMetaverse.InventoryFolder newParent) libremetaverse libremetaverse::InventoryManager::move_ pub fn move_(&self, item: libremetaverse::InventoryBase, new_parent: libremetaverse::InventoryFolder) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryManager.MoveFolder(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Threading.CancellationToken) method System.Void LibreMetaverse.InventoryManager.MoveFolder(LibreMetaverse.UUID folderID, LibreMetaverse.UUID newParentID, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::move_folder_with_uuid_uuid_cancellation_token pub fn move_folder_with_uuid_uuid_cancellation_token(&self, folder_id: libremetaverse_types::UUID, new_parent_id: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(), crate::Error> shared_self,owned,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped
@@ -11966,7 +11966,7 @@ M:LibreMetaverse.InventoryManager.UploadThumbnailAsync(LibreMetaverse.UUID,Libre
M:LibreMetaverse.InventoryManager.WaitForNextInventoryOfferAsync(System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.InventoryObjectOfferedEventArgs> LibreMetaverse.InventoryManager.WaitForNextInventoryOfferAsync(System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::InventoryManager::wait_for_next_inventory_offer pub async fn wait_for_next_inventory_offer(&self, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<libremetaverse::InventoryObjectOfferedEventArgs, crate::Error> shared_self,optional_owned async Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryMaterial.#ctor(LibreMetaverse.UUID) constructor LibreMetaverse.InventoryMaterial(LibreMetaverse.UUID UUID) libremetaverse libremetaverse::InventoryMaterial::new pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.InventoryNode.#ctor constructor LibreMetaverse.InventoryNode() libremetaverse libremetaverse::InventoryNode::new_with_constructor pub fn new_with_constructor() -> Result<Self, crate::Error> none sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryNode.#ctor(LibreMetaverse.InventoryBase) constructor LibreMetaverse.InventoryNode(LibreMetaverse.InventoryBase data) libremetaverse libremetaverse::InventoryNode::new_with_inventory_base pub fn new_with_inventory_base(data: libremetaverse::InventoryBase) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryNode.#ctor(LibreMetaverse.InventoryBase) constructor LibreMetaverse.InventoryNode(LibreMetaverse.InventoryBase data) libremetaverse libremetaverse::InventoryNode::new_with_inventory_base pub fn new_with_inventory_base(data: &dyn libremetaverse::InventoryObjectClass) -> Result<Self, crate::Error> shared_borrow sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryNode.#ctor(LibreMetaverse.InventoryBase,LibreMetaverse.InventoryNode) constructor LibreMetaverse.InventoryNode(LibreMetaverse.InventoryBase data, LibreMetaverse.InventoryNode parent) libremetaverse libremetaverse::InventoryNode::new_with_inventory_base_inventory_node pub fn new_with_inventory_base_inventory_node(data: libremetaverse::InventoryBase, parent: libremetaverse::InventoryNode) -> Result<Self, crate::Error> owned,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.InventoryNode.ToString method System.String LibreMetaverse.InventoryNode.ToString() libremetaverse libremetaverse::InventoryNode::to_string pub fn to_string(&self) -> String shared_self sync infallible_placeholder direct_snake_case method mapped
M:LibreMetaverse.InventoryNodeDictionary.#ctor(LibreMetaverse.InventoryNode) constructor LibreMetaverse.InventoryNodeDictionary(LibreMetaverse.InventoryNode parent) libremetaverse libremetaverse::InventoryNodeDictionary::new pub fn new(parent: libremetaverse::InventoryNode) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
@@ -28135,7 +28135,7 @@ P:LibreMetaverse.InventoryManager.FolderUpdateResult.FolderID property LibreMeta
P:LibreMetaverse.InventoryManager.FolderUpdateResult.Success property System.Boolean LibreMetaverse.InventoryManager.FolderUpdateResult.Success libremetaverse libremetaverse::InventoryManagerFolderUpdateResult::success pub fn success(&self) -> bool ; pub fn set_success(&mut self, value: bool) shared_or_mutable_self sync infallible_placeholder direct_snake_case accessor_methods mapped
P:LibreMetaverse.InventoryManager.NoResults property System.Threading.Tasks.Task<System.Collections.Generic.List<LibreMetaverse.InventoryBase>> LibreMetaverse.InventoryManager.NoResults libremetaverse libremetaverse::InventoryManager::no_results pub fn no_results() -> libremetaverse_types::compat::Task<Vec<libremetaverse::InventoryBase>> none sync infallible_placeholder direct_snake_case accessor_methods mapped
P:LibreMetaverse.InventoryManager.Store property LibreMetaverse.Inventory LibreMetaverse.InventoryManager.Store libremetaverse libremetaverse::InventoryManager::store pub fn store(&self) -> Option<libremetaverse::Inventory> shared_self sync infallible_placeholder direct_snake_case accessor_methods mapped
P:LibreMetaverse.InventoryNode.Data property LibreMetaverse.InventoryBase LibreMetaverse.InventoryNode.Data libremetaverse libremetaverse::InventoryNode::data pub fn data(&self) -> Option<libremetaverse::InventoryBase> ; pub fn set_data(&mut self, value: Option<libremetaverse::InventoryBase>) shared_or_mutable_self sync infallible_placeholder direct_snake_case accessor_methods mapped
P:LibreMetaverse.InventoryNode.Data property LibreMetaverse.InventoryBase LibreMetaverse.InventoryNode.Data libremetaverse libremetaverse::InventoryNode::data pub fn data(&self) -> Option<Box<dyn libremetaverse::InventoryObjectClass>> ; pub fn set_data(&mut self, value: Option<Box<dyn libremetaverse::InventoryObjectClass>>) shared_or_mutable_self sync infallible_placeholder direct_snake_case accessor_methods mapped
P:LibreMetaverse.InventoryNode.ModifyTime property System.DateTime LibreMetaverse.InventoryNode.ModifyTime libremetaverse libremetaverse::InventoryNode::modify_time pub fn modify_time(&self) -> std::time::SystemTime shared_self sync infallible_placeholder direct_snake_case accessor_methods mapped
P:LibreMetaverse.InventoryNode.NeedsUpdate property System.Boolean LibreMetaverse.InventoryNode.NeedsUpdate libremetaverse libremetaverse::InventoryNode::needs_update pub fn needs_update(&self) -> bool ; pub fn set_needs_update(&mut self, value: bool) shared_or_mutable_self sync infallible_placeholder direct_snake_case accessor_methods mapped
P:LibreMetaverse.InventoryNode.Nodes property LibreMetaverse.InventoryNodeDictionary LibreMetaverse.InventoryNode.Nodes libremetaverse libremetaverse::InventoryNode::nodes pub fn nodes(&self) -> libremetaverse::InventoryNodeDictionary ; pub fn set_nodes(&mut self, value: libremetaverse::InventoryNodeDictionary) shared_or_mutable_self sync infallible_placeholder direct_snake_case accessor_methods mapped
Can't render this file because it is too large.

View File

@@ -14199,14 +14199,16 @@ impl Inventory {
)
}
/// C# member: `M:LibreMetaverse.Inventory.#ctor(LibreMetaverse.GridClient)`.
pub fn new_with_grid_client(client: libremetaverse::GridClient) -> Result<Self, crate::Error> {
pub fn new_with_grid_client(
client: std::sync::Arc<libremetaverse::GridClient>,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Inventory.#ctor(LibreMetaverse.GridClient)",
)
}
/// C# member: `M:LibreMetaverse.Inventory.#ctor(LibreMetaverse.GridClient,LibreMetaverse.UUID)`.
pub fn new_with_grid_client_uuid(
client: libremetaverse::GridClient,
client: std::sync::Arc<libremetaverse::GridClient>,
owner: libremetaverse_types::UUID,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
@@ -14220,7 +14222,7 @@ impl Inventory {
/// C# member: `M:LibreMetaverse.Inventory.Contains(LibreMetaverse.InventoryBase)`.
pub fn contains_with_inventory_base(
&self,
obj: libremetaverse::InventoryBase,
obj: &dyn libremetaverse::InventoryObjectClass,
) -> Result<bool, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Inventory.Contains(LibreMetaverse.InventoryBase)",
@@ -14247,8 +14249,8 @@ impl Inventory {
/// C# member: `M:LibreMetaverse.Inventory.GetContents(LibreMetaverse.InventoryFolder)`.
pub fn get_contents_with_inventory_folder(
&self,
folder: libremetaverse::InventoryFolder,
) -> Result<Vec<libremetaverse::InventoryBase>, crate::Error> {
folder: &libremetaverse::InventoryFolder,
) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Inventory.GetContents(LibreMetaverse.InventoryFolder)",
)
@@ -14257,7 +14259,7 @@ impl Inventory {
pub fn get_contents_with_uuid(
&self,
folder: libremetaverse_types::UUID,
) -> Result<Vec<libremetaverse::InventoryBase>, crate::Error> {
) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Inventory.GetContents(LibreMetaverse.UUID)",
)
@@ -14299,7 +14301,10 @@ impl Inventory {
)
}
/// C# member: `M:LibreMetaverse.Inventory.RemoveNodeFor(LibreMetaverse.InventoryBase)`.
pub fn remove_node_for(&self, item: libremetaverse::InventoryBase) -> Result<(), crate::Error> {
pub fn remove_node_for(
&self,
item: &dyn libremetaverse::InventoryObjectClass,
) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Inventory.RemoveNodeFor(LibreMetaverse.InventoryBase)",
)
@@ -14350,10 +14355,10 @@ impl Inventory {
pub fn try_get_value_with_uuid_inventory_base(
&self,
uuid: libremetaverse_types::UUID,
item: &mut Option<libremetaverse::InventoryBase>,
) -> bool {
libremetaverse_types::unimplemented_api!(
"M:LibreMetaverse.Inventory.TryGetValue(LibreMetaverse.UUID,LibreMetaverse.InventoryBase@)"
item: &mut Option<Box<dyn libremetaverse::InventoryObjectClass>>,
) -> Result<bool, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Inventory.TryGetValue(LibreMetaverse.UUID,LibreMetaverse.InventoryBase@)",
)
}
/// C# member: `M:LibreMetaverse.Inventory.TryGetValue``1(LibreMetaverse.UUID,``0@)`.
@@ -14367,7 +14372,10 @@ impl Inventory {
)
}
/// C# member: `M:LibreMetaverse.Inventory.UpdateNodeFor(LibreMetaverse.InventoryBase)`.
pub fn update_node_for(&self, item: libremetaverse::InventoryBase) -> Result<(), crate::Error> {
pub fn update_node_for(
&self,
item: &dyn libremetaverse::InventoryObjectClass,
) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Inventory.UpdateNodeFor(LibreMetaverse.InventoryBase)",
)
@@ -14438,7 +14446,9 @@ impl InventoryAISClient {
/// C# member: `F:LibreMetaverse.InventoryAISClient.LIBRARY_CAP_NAME`.
pub const LIBRARY_CAP_NAME: &'static str = "LibraryAPIv3";
/// C# member: `M:LibreMetaverse.InventoryAISClient.#ctor(LibreMetaverse.GridClient)`.
pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> {
pub fn new(
client: Option<std::sync::Arc<libremetaverse::GridClient>>,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.InventoryAISClient.#ctor(LibreMetaverse.GridClient)",
)
@@ -14731,10 +14741,10 @@ impl InventoryAISClient {
/// C# member: `M:LibreMetaverse.InventoryAISClient.ParseEmbedded(LibreMetaverse.StructuredData.OSDMap,System.Collections.Generic.List{LibreMetaverse.InventoryFolder}@,System.Collections.Generic.List{LibreMetaverse.InventoryItem}@,System.Collections.Generic.List{LibreMetaverse.InventoryItem}@)`.
pub fn parse_embedded(
&self,
response: libremetaverse_structured_data::OSDMap,
folders: &mut Vec<libremetaverse::InventoryFolder>,
items: &mut Vec<libremetaverse::InventoryItem>,
links: &mut Vec<libremetaverse::InventoryItem>,
response: libremetaverse_structured_data::OSD,
folders: &mut Option<Vec<libremetaverse::InventoryFolder>>,
items: &mut Option<Vec<libremetaverse::InventoryItem>>,
links: &mut Option<Vec<libremetaverse::InventoryItem>>,
) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.InventoryAISClient.ParseEmbedded(LibreMetaverse.StructuredData.OSDMap,System.Collections.Generic.List{LibreMetaverse.InventoryFolder}@,System.Collections.Generic.List{LibreMetaverse.InventoryItem}@,System.Collections.Generic.List{LibreMetaverse.InventoryItem}@)",
@@ -14752,7 +14762,7 @@ impl InventoryAISClient {
/// C# member: `M:LibreMetaverse.InventoryAISClient.ParseItemsFromEmbedded(LibreMetaverse.StructuredData.OSDMap)`.
pub fn parse_items_from_embedded(
&self,
response: libremetaverse_structured_data::OSDMap,
response: Option<libremetaverse_structured_data::OSD>,
) -> Result<Vec<libremetaverse::InventoryItem>, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.InventoryAISClient.ParseItemsFromEmbedded(LibreMetaverse.StructuredData.OSDMap)",
@@ -14761,7 +14771,7 @@ impl InventoryAISClient {
/// C# member: `M:LibreMetaverse.InventoryAISClient.ParseLinksFromEmbedded(LibreMetaverse.StructuredData.OSDMap)`.
pub fn parse_links_from_embedded(
&self,
response: libremetaverse_structured_data::OSDMap,
response: Option<libremetaverse_structured_data::OSD>,
) -> Result<Vec<libremetaverse::InventoryItem>, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.InventoryAISClient.ParseLinksFromEmbedded(LibreMetaverse.StructuredData.OSDMap)",
@@ -14859,7 +14869,10 @@ impl InventoryAISClient {
}
/// C# type: `T:LibreMetaverse.InventoryAnimation`.
pub struct InventoryAnimation;
pub struct InventoryAnimation {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventoryAnimation {
/// C# member: `M:LibreMetaverse.InventoryAnimation.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {
@@ -14953,7 +14966,10 @@ impl InventoryBase {
}
/// C# type: `T:LibreMetaverse.InventoryCallingCard`.
pub struct InventoryCallingCard;
pub struct InventoryCallingCard {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventoryCallingCard {
/// C# member: `M:LibreMetaverse.InventoryCallingCard.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {
@@ -14964,7 +14980,10 @@ impl InventoryCallingCard {
}
/// C# type: `T:LibreMetaverse.InventoryCategory`.
pub struct InventoryCategory;
pub struct InventoryCategory {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventoryCategory {
/// C# member: `M:LibreMetaverse.InventoryCategory.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {
@@ -15083,7 +15102,10 @@ impl InventoryFolder {
}
/// C# type: `T:LibreMetaverse.InventoryGesture`.
pub struct InventoryGesture;
pub struct InventoryGesture {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventoryGesture {
/// C# member: `M:LibreMetaverse.InventoryGesture.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {
@@ -15312,7 +15334,10 @@ impl InventoryItemFlags {
}
/// C# type: `T:LibreMetaverse.InventoryLSL`.
pub struct InventoryLSL;
pub struct InventoryLSL {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventoryLSL {
/// C# member: `M:LibreMetaverse.InventoryLSL.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {
@@ -15323,7 +15348,10 @@ impl InventoryLSL {
}
/// C# type: `T:LibreMetaverse.InventoryLandmark`.
pub struct InventoryLandmark;
pub struct InventoryLandmark {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventoryLandmark {
/// C# member: `M:LibreMetaverse.InventoryLandmark.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {
@@ -15435,7 +15463,9 @@ impl InventoryManager {
/// C# member: `F:LibreMetaverse.InventoryManager.MAX_GIVE_ITEMS`.
pub const MAX_GIVE_ITEMS: i32 = 66;
/// C# member: `M:LibreMetaverse.InventoryManager.#ctor(LibreMetaverse.GridClient)`.
pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> {
pub fn new(
client: Option<std::sync::Arc<libremetaverse::GridClient>>,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.InventoryManager.#ctor(LibreMetaverse.GridClient)",
)
@@ -15502,7 +15532,7 @@ impl InventoryManager {
pub fn create_inventory_item(
type_: libremetaverse_types::InventoryType,
id: libremetaverse_types::UUID,
) -> Result<libremetaverse::InventoryItem, crate::Error> {
) -> Result<Box<dyn libremetaverse::InventoryItemClass>, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.InventoryManager.CreateInventoryItem(LibreMetaverse.InventoryType,LibreMetaverse.UUID)",
)
@@ -15730,7 +15760,7 @@ impl InventoryManager {
order: libremetaverse::InventorySortOrder,
cancellation_token: Option<libremetaverse_types::compat::CancellationToken>,
follow_links: Option<bool>,
) -> Result<Vec<libremetaverse::InventoryBase>, crate::Error> {
) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken,System.Boolean)",
)
@@ -15755,7 +15785,7 @@ impl InventoryManager {
object_local_id: u32,
simulator: Option<libremetaverse::Simulator>,
cancellation_token: Option<libremetaverse_types::compat::CancellationToken>,
) -> Result<Vec<libremetaverse::InventoryBase>, crate::Error> {
) -> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID,System.UInt32,LibreMetaverse.Simulator,System.Threading.CancellationToken)",
)
@@ -15787,7 +15817,7 @@ impl InventoryManager {
)
}
/// C# member: `M:LibreMetaverse.InventoryManager.ItemCRC(LibreMetaverse.InventoryItem)`.
pub fn item_crc(iitem: libremetaverse::InventoryItem) -> Result<u32, crate::Error> {
pub fn item_crc(iitem: &libremetaverse::InventoryItem) -> Result<u32, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.InventoryManager.ItemCRC(LibreMetaverse.InventoryItem)",
)
@@ -16783,7 +16813,10 @@ impl InventoryManagerFolderUpdateResult {
}
/// C# type: `T:LibreMetaverse.InventoryMaterial`.
pub struct InventoryMaterial;
pub struct InventoryMaterial {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventoryMaterial {
/// C# member: `M:LibreMetaverse.InventoryMaterial.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {
@@ -16802,7 +16835,7 @@ impl InventoryNode {
}
/// C# member: `M:LibreMetaverse.InventoryNode.#ctor(LibreMetaverse.InventoryBase)`.
pub fn new_with_inventory_base(
data: libremetaverse::InventoryBase,
data: &dyn libremetaverse::InventoryObjectClass,
) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.InventoryNode.#ctor(LibreMetaverse.InventoryBase)",
@@ -16822,11 +16855,11 @@ impl InventoryNode {
libremetaverse_types::unimplemented_api!("M:LibreMetaverse.InventoryNode.ToString")
}
/// C# member: `P:LibreMetaverse.InventoryNode.Data`.
pub fn data(&self) -> Option<libremetaverse::InventoryBase> {
pub fn data(&self) -> Option<Box<dyn libremetaverse::InventoryObjectClass>> {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.InventoryNode.Data")
}
/// Setter for C# member: `P:LibreMetaverse.InventoryNode.Data`.
pub fn set_data(&mut self, value: Option<libremetaverse::InventoryBase>) {
pub fn set_data(&mut self, value: Option<Box<dyn libremetaverse::InventoryObjectClass>>) {
libremetaverse_types::unimplemented_api!("P:LibreMetaverse.InventoryNode.Data")
}
/// C# member: `P:LibreMetaverse.InventoryNode.ModifyTime`.
@@ -16935,7 +16968,10 @@ impl InventoryNodeDictionary {
}
/// C# type: `T:LibreMetaverse.InventoryNotecard`.
pub struct InventoryNotecard;
pub struct InventoryNotecard {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventoryNotecard {
/// C# member: `M:LibreMetaverse.InventoryNotecard.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {
@@ -17101,7 +17137,10 @@ impl InventoryObjectUpdatedEventArgs {
}
/// C# type: `T:LibreMetaverse.InventorySettings`.
pub struct InventorySettings;
pub struct InventorySettings {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventorySettings {
/// C# member: `M:LibreMetaverse.InventorySettings.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {
@@ -17112,7 +17151,10 @@ impl InventorySettings {
}
/// C# type: `T:LibreMetaverse.InventorySnapshot`.
pub struct InventorySnapshot;
pub struct InventorySnapshot {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventorySnapshot {
/// C# member: `M:LibreMetaverse.InventorySnapshot.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {
@@ -17138,7 +17180,10 @@ impl InventorySortOrder {
}
/// C# type: `T:LibreMetaverse.InventorySound`.
pub struct InventorySound;
pub struct InventorySound {
/// Rust composition for C# base type `LibreMetaverse.InventoryItem`.
pub base: libremetaverse::InventoryItem,
}
impl InventorySound {
/// C# member: `M:LibreMetaverse.InventorySound.#ctor(LibreMetaverse.UUID)`.
pub fn new(uuid: libremetaverse_types::UUID) -> Result<Self, crate::Error> {

View File

@@ -143,6 +143,77 @@ pub use libremetaverse_structured_data as structured_data;
pub use libremetaverse_types as types;
pub use libremetaverse_types::Error;
/// Rust object-safe view of the C# `InventoryBase` inheritance hierarchy.
pub trait InventoryObjectClass: std::any::Any {
/// Returns the concrete value for exact C# runtime-type checks.
fn as_any(&self) -> &dyn std::any::Any;
/// Returns the shared `InventoryBase` portion of the concrete object.
fn inventory_base(&self) -> &InventoryBase;
}
/// Rust object-safe view of concrete classes derived from C# `InventoryItem`.
pub trait InventoryItemClass: InventoryObjectClass {}
macro_rules! inventory_object_class {
($type:ty, $base:ident $(.$nested:ident)*) => {
impl InventoryObjectClass for $type {
fn as_any(&self) -> &dyn std::any::Any {
self
}
fn inventory_base(&self) -> &InventoryBase {
&self.$base$(.$nested)*
}
}
};
}
impl InventoryObjectClass for InventoryBase {
fn as_any(&self) -> &dyn std::any::Any {
self
}
fn inventory_base(&self) -> &InventoryBase {
self
}
}
inventory_object_class!(InventoryFolder, base);
inventory_object_class!(InventoryItem, base);
inventory_object_class!(InventoryAnimation, base.base);
inventory_object_class!(InventoryAttachment, base.base);
inventory_object_class!(InventoryCallingCard, base.base);
inventory_object_class!(InventoryCategory, base.base);
inventory_object_class!(InventoryGesture, base.base);
inventory_object_class!(InventoryLSL, base.base);
inventory_object_class!(InventoryLandmark, base.base);
inventory_object_class!(InventoryMaterial, base.base);
inventory_object_class!(InventoryNotecard, base.base);
inventory_object_class!(InventoryObject, base.base);
inventory_object_class!(InventorySettings, base.base);
inventory_object_class!(InventorySnapshot, base.base);
inventory_object_class!(InventorySound, base.base);
inventory_object_class!(InventoryTexture, base.base);
inventory_object_class!(InventoryWearable, base.base);
impl InventoryItemClass for InventoryItem {}
impl InventoryItemClass for InventoryAnimation {}
impl InventoryItemClass for InventoryAttachment {}
impl InventoryItemClass for InventoryCallingCard {}
impl InventoryItemClass for InventoryCategory {}
impl InventoryItemClass for InventoryGesture {}
impl InventoryItemClass for InventoryLSL {}
impl InventoryItemClass for InventoryLandmark {}
impl InventoryItemClass for InventoryMaterial {}
impl InventoryItemClass for InventoryNotecard {}
impl InventoryItemClass for InventoryObject {}
impl InventoryItemClass for InventorySettings {}
impl InventoryItemClass for InventorySnapshot {}
impl InventoryItemClass for InventorySound {}
impl InventoryItemClass for InventoryTexture {}
impl InventoryItemClass for InventoryWearable {}
/// Project-owned boundary types for external `MessagePack` signatures.
pub mod message_pack {
pub trait IMessagePackFormatter<T = ()> {}

View File

@@ -5,9 +5,9 @@ Generated from LibreMetaverse `2aa70bb68513b39795da5d13c88f31b86e85a3ba`. Stable
## Status
- Total: **1,289**
- Pending/unreviewed: **819**
- Translated/reviewed: **455**
- Ignored live/reviewed: **11** (19 upstream live candidates)
- Pending/unreviewed: **779**
- Translated/reviewed: **488**
- Ignored live/reviewed: **18** (19 upstream live candidates)
- Benchmarks/reviewed: **4** (4 upstream benchmark candidates)
- Drifted: **0**
@@ -165,9 +165,9 @@ Reviewed Rust tests live outside `generated_parity.rs` and carry a `parity-case`
| `LibreMetaverse.Tests/BinaryLLSDTests.cs::BinarySDTests.DeserializeNestedComposite::test` | `BinarySDTests.DeserializeNestedComposite` | `` | `LibreMetaverse.Tests/BinaryLLSDTests.cs:598` | `` | `` | `tests/compat/tests/structured_data.rs:579 (`binary_deserialize_nested_composite`)` | `translated` | `60f8cf739fecf42c98ae4e0878d06234278b9d8370afc38f0d501d62f8ff9cdf` |
| `LibreMetaverse.Tests/BinaryLLSDTests.cs::BinarySDTests.SerializeNestedComposite::test` | `BinarySDTests.SerializeNestedComposite` | `` | `LibreMetaverse.Tests/BinaryLLSDTests.cs:632` | `` | `` | `tests/compat/tests/structured_data.rs:587 (`binary_serialize_nested_composite`)` | `translated` | `092b52da3f0cf720595fdb84c929c8ad033c60ff978429cb1d27f9e215936b10` |
| `LibreMetaverse.Tests/BinaryLLSDTests.cs::BinarySDTests.SerializeLongMessage::test` | `BinarySDTests.SerializeLongMessage` | `` | `LibreMetaverse.Tests/BinaryLLSDTests.cs:676` | `` | `` | `tests/compat/tests/structured_data.rs:598 (`binary_serialize_long_message`)` | `translated` | `b49afb91578e6c19193cd48acf161a9f8c57bbd20245783054709a509f63780e` |
| `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.InventoryAISClient_Null_Throws::test` | `ConstructorNullArgumentTests.InventoryAISClient_Null_Throws` | `` | `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs:9` | `` | `` | `pending source translation` | `pending` | `ac92e375efc45c50b37e6c82aea372d605fceb470ce053a025e05ff47a5c7121` |
| `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.InventoryAISClient_Null_Throws::test` | `ConstructorNullArgumentTests.InventoryAISClient_Null_Throws` | `` | `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs:9` | `` | `` | `tests/compat/tests/inventory_ais_semantics.rs:120 (`inventory_ais_client_null_throws`)` | `translated` | `ac92e375efc45c50b37e6c82aea372d605fceb470ce053a025e05ff47a5c7121` |
| `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.GridManager_Null_Throws::test` | `ConstructorNullArgumentTests.GridManager_Null_Throws` | `` | `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs:15` | `` | `` | `pending source translation` | `pending` | `e972a95f334b0f46948cda34c27124c28c44faf4372d0e598d7dc60050b49be4` |
| `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.InventoryManager_Null_Throws::test` | `ConstructorNullArgumentTests.InventoryManager_Null_Throws` | `` | `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs:21` | `` | `` | `pending source translation` | `pending` | `5e7498066c944800354abbc71eea825fe90d0c40a25a6065967a3ebcc9efea74` |
| `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.InventoryManager_Null_Throws::test` | `ConstructorNullArgumentTests.InventoryManager_Null_Throws` | `` | `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs:21` | `` | `` | `tests/compat/tests/inventory_manager_semantics.rs:16 (`inventory_manager_null_throws`)` | `translated` | `5e7498066c944800354abbc71eea825fe90d0c40a25a6065967a3ebcc9efea74` |
| `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.AppearanceManager_Null_Throws::test` | `ConstructorNullArgumentTests.AppearanceManager_Null_Throws` | `` | `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs:27` | `` | `` | `pending source translation` | `pending` | `a3c872805bc924b5a1a9441d5c9eb61ed6d6e9477e4bb411131359290b144ab4` |
| `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.ObjectManager_Null_Throws::test` | `ConstructorNullArgumentTests.ObjectManager_Null_Throws` | `` | `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs:33` | `` | `` | `pending source translation` | `pending` | `8a11feba0edfb35e5dd99f681182e8f5a5cf8a3f738211b45a683a8a2ad45ddb` |
| `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.AgentManager_Null_Throws::test` | `ConstructorNullArgumentTests.AgentManager_Null_Throws` | `` | `LibreMetaverse.Tests/ConstructorNullArgumentTests.cs:39` | `` | `` | `pending source translation` | `pending` | `d86e41b6cdd03063685aa330c31b9a274c1d400b9a461abf3065fe185fe0bbf0` |
@@ -274,40 +274,40 @@ Reviewed Rust tests live outside `generated_parity.rs` and carry a `parity-case`
| `LibreMetaverse.Tests/HelpersZeroCodingTests.cs::HelpersZeroCodingTests.ZeroEncode_WithAppendedAcks_HandlesCorrectly::test` | `HelpersZeroCodingTests.ZeroEncode_WithAppendedAcks_HandlesCorrectly` | `` | `LibreMetaverse.Tests/HelpersZeroCodingTests.cs:231` | `Helpers` | `` | `tests/compat/tests/wire_semantics.rs:235 (`zero_encode_with_appended_acks_preserves_count`)` | `translated` | `9803ec7bad46a1fd0f32c58d3ee08cf6a98b03a40a336ae231d1faf8211b273a` |
| `LibreMetaverse.Tests/HelpersZeroCodingTests.cs::HelpersZeroCodingTests.ZeroEncodeAndDecode_RoundTrip_PreservesData::test` | `HelpersZeroCodingTests.ZeroEncodeAndDecode_RoundTrip_PreservesData` | `` | `LibreMetaverse.Tests/HelpersZeroCodingTests.cs:254` | `Helpers` | `` | `tests/compat/tests/wire_semantics.rs:248 (`zero_encode_decode_round_trip_preserves_patterns`)` | `translated` | `7847520873f87d798ea94fd1b6543db9d3606829a4bc3f4ec873e629fb6687eb` |
| `LibreMetaverse.Tests/HttpCapsClientNonHttpLocationTests.cs::HttpCapsClientNonHttpLocationTests.PutAsync_ResponseWithNonHttpLocationHeader_DoesNotThrow::test` | `HttpCapsClientNonHttpLocationTests.PutAsync_ResponseWithNonHttpLocationHeader_DoesNotThrow` | `` | `LibreMetaverse.Tests/HttpCapsClientNonHttpLocationTests.cs:47` | `Http` | `` | `tests/compat/tests/network_semantics.rs:279 (`put_response_with_non_http_location_does_not_throw`)` | `translated` | `9dbcf4023212af6f2294fa048068fe2f4d9e7e3f976d8eefb1dacbc9f6899aa8` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_ObjectAsset_ResultsInAttachmentInventoryTypeAndParsesFields::test` | `InventoryAISClientTests.ParseLinksFromEmbedded_ObjectAsset_ResultsInAttachmentInventoryTypeAndParsesFields` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:37` | `` | `` | `pending source translation` | `pending` | `3ae365ed34f12d036dcd44c94f8568d163cfeec2a58b4975975b77b418770131` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_ItemsKey_ParsesConcreteItems::test` | `InventoryAISClientTests.ParseItemsFromEmbedded_ItemsKey_ParsesConcreteItems` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:82` | `` | `` | `pending source translation` | `pending` | `d9e7c64106639071e1ec6ada7346bfa050a31183becaac79efefcd4755fe2855` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_MeshAsset_TreatedAsAttachment::test` | `InventoryAISClientTests.ParseLinksFromEmbedded_MeshAsset_TreatedAsAttachment` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:122` | `` | `` | `pending source translation` | `pending` | `f807110d577c654128dd8d42e618c610c260c4f3367cf2795776564409f876a2` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_TopLevelItemsKey_WorksWithoutEmbedded::test` | `InventoryAISClientTests.ParseItemsFromEmbedded_TopLevelItemsKey_WorksWithoutEmbedded` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:160` | `` | `` | `pending source translation` | `pending` | `9c8f2090d59ff5e75e75381a7283c501cadd56e591991cdead23c504738a0a6d` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_TopLevelLinksKey_WorksWithoutEmbedded::test` | `InventoryAISClientTests.ParseLinksFromEmbedded_TopLevelLinksKey_WorksWithoutEmbedded` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:193` | `` | `` | `pending source translation` | `pending` | `29afd2bd6a554959d6cfa99b632672d56bbb5bcad2ccbaf8caf4773a514f5d79` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_NullOrEmpty_ReturnsEmptyList::test` | `InventoryAISClientTests.ParseItemsFromEmbedded_NullOrEmpty_ReturnsEmptyList` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:227` | `` | `` | `pending source translation` | `pending` | `198fb619bbf396a4b1a7b4b85b7fba8808ae127e2575b2b84d21f01a2bdbc445` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseEmbedded_CombinesItemsAndLinks::test` | `InventoryAISClientTests.ParseEmbedded_CombinesItemsAndLinks` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:236` | `` | `` | `pending source translation` | `pending` | `f2ebf4638c9aef3c846dc182d97d80c95118799428cf8c2bba86163e33196846` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.MoveCategoryLinksAsync_AlwaysReturnsFalse::test` | `InventoryAISClientTests.MoveCategoryLinksAsync_AlwaysReturnsFalse` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:259` | `` | `` | `pending source translation` | `pending` | `bebad05897efc0da2f959b4f567faa3ffee950520d13265ecbab1dee978f4886` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.MoveCategoryLinksAsync_ReturnsCompletedTask::test` | `InventoryAISClientTests.MoveCategoryLinksAsync_ReturnsCompletedTask` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:268` | `` | `` | `pending source translation` | `pending` | `f9830b11e6a75c90f8394a5ade56bbd542c140be4c050ba7db6c9ee4d2b7a699` |
| `LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventorySkeletonIsPopulatedAfterLogin::test` | `InventoryFetchTests.InventorySkeletonIsPopulatedAfterLogin` | `` | `LibreMetaverse.Tests/InventoryFetchTests.cs:109` | `Inventory, RequiresLiveServer` | `` | `pending source translation` | `pending` | `ea1508e3c676639f00bb8a4c4c72d2ee668603bfbff40ee0b93d7f4beb607f75` |
| `LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryRootContainsFolders::test` | `InventoryFetchTests.InventoryRootContainsFolders` | `` | `LibreMetaverse.Tests/InventoryFetchTests.cs:147` | `Inventory, RequiresLiveServer` | `` | `pending source translation` | `pending` | `71f41c718060622e1fd653e6b0fc9fe65f3cd68cab3d128f494cdbc90f9d2726` |
| `LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryFolderContainsItems::test` | `InventoryFetchTests.InventoryFolderContainsItems` | `` | `LibreMetaverse.Tests/InventoryFetchTests.cs:194` | `Inventory, RequiresLiveServer` | `` | `pending source translation` | `pending` | `f0d77649b82d4d7d7778acebd851dd4eb44b76eb687af07bccdd20a1efe96223` |
| `LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryItemCanBeFetchedById::test` | `InventoryFetchTests.InventoryItemCanBeFetchedById` | `` | `LibreMetaverse.Tests/InventoryFetchTests.cs:276` | `Inventory, RequiresLiveServer` | `` | `pending source translation` | `pending` | `7fe89086754a673ab69814202b48aab9add30dd63ee98a953bdedd54d6788af2` |
| `LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.EncryptDecrypt_RoundTrip::test` | `InventoryManagerTests.EncryptDecrypt_RoundTrip` | `` | `LibreMetaverse.Tests/InventoryManagerTests.cs:35` | `` | `` | `pending source translation` | `pending` | `7b59c330ffacf1174dd884f369a4e4015e1a212a0e43d7fa8889f7505dd5599d` |
| `LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.ItemCRC_IsDeterministic_AndChangesWhenFieldsChange::test` | `InventoryManagerTests.ItemCRC_IsDeterministic_AndChangesWhenFieldsChange` | `` | `LibreMetaverse.Tests/InventoryManagerTests.cs:45` | `` | `` | `pending source translation` | `pending` | `dbd322778ad7f110abce5f10a0c83ad002ae76f6a114fa795fb90a799f4ff077` |
| `LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.CreateInventoryItem_ReturnsCorrectSubclass::test` | `InventoryManagerTests.CreateInventoryItem_ReturnsCorrectSubclass` | `` | `LibreMetaverse.Tests/InventoryManagerTests.cs:77` | `` | `` | `pending source translation` | `pending` | `219f8c91bc1b3d5b5d3e5b2f2880c5733fd02e6103ccc9c6ecbf8d03328274f6` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.AddAndGetItem::test` | `InventoryTests.AddAndGetItem` | `` | `LibreMetaverse.Tests/InventoryTests.cs:53` | `` | `` | `pending source translation` | `pending` | `24702f0cf9215beee29123ee81dab4a7fe971beb197ecceac9a1761b695bce45` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateItemParent::test` | `InventoryTests.UpdateItemParent` | `` | `LibreMetaverse.Tests/InventoryTests.cs:76` | `` | `` | `pending source translation` | `pending` | `ea1a73e28fb92b873ee28102e81811d769b5cd815d2e1d756ece6ea635e5c014` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.InventoryNodeModifyTime_SelfLoop::test` | `InventoryTests.InventoryNodeModifyTime_SelfLoop` | `` | `LibreMetaverse.Tests/InventoryTests.cs:98` | `` | `` | `pending source translation` | `pending` | `f8050cc284f7954c1301091ddc1cbf0fa76073806eee7de4f6cb21063591fbf1` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateNodeFor_SelfLoop::test` | `InventoryTests.UpdateNodeFor_SelfLoop` | `` | `LibreMetaverse.Tests/InventoryTests.cs:109` | `` | `` | `pending source translation` | `pending` | `14f42e5263c465e8534347c5a3195c195e2d90371dbc2f69d36a40362384505c` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateNodeFor_ComplexSelfLoop::test` | `InventoryTests.UpdateNodeFor_ComplexSelfLoop` | `` | `LibreMetaverse.Tests/InventoryTests.cs:120` | `` | `` | `pending source translation` | `pending` | `a2fc7b29b8a7a7767c42ea9c7fb9628451c88991c3eb1ecbd2ce0952ab0b5700` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.RemoveItem::test` | `InventoryTests.RemoveItem` | `` | `LibreMetaverse.Tests/InventoryTests.cs:136` | `` | `` | `pending source translation` | `pending` | `1e72f9049b9114f0c56e152d84190d31bca7a862f7ad1459624d753beb6818b4` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.SaveAndRestoreAsync::test` | `InventoryTests.SaveAndRestoreAsync` | `` | `LibreMetaverse.Tests/InventoryTests.cs:150` | `` | `` | `pending source translation` | `pending` | `bf23b1c67cc9618713d2d8e6653f0ffbbf4c24d7f2c59c5dd639047f7e0c8156` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.GetNodeOrDefault_ReturnsNullWhenMissing::test` | `InventoryTests.GetNodeOrDefault_ReturnsNullWhenMissing` | `` | `LibreMetaverse.Tests/InventoryTests.cs:175` | `` | `` | `pending source translation` | `pending` | `f5651b5a143470c3ab6ba1f835206a1a55a6218c28242dc12c5d6b5e89519596` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.TryGetValue_Generic::test` | `InventoryTests.TryGetValue_Generic` | `` | `LibreMetaverse.Tests/InventoryTests.cs:182` | `` | `` | `pending source translation` | `pending` | `e6f6d6535af9d011e65cb3c297fe99543f85b64382c47e1756f051d6031886f5` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.RemoveFolderRemovesAllDescendants::test` | `InventoryTests.RemoveFolderRemovesAllDescendants` | `` | `LibreMetaverse.Tests/InventoryTests.cs:196` | `` | `` | `pending source translation` | `pending` | `b537223d271b75c11adfa6d87c1e79bb29366f294657ddf71f236fab0dee009f` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.DescendentCountUpdatesOnAddAndRemove::test` | `InventoryTests.DescendentCountUpdatesOnAddAndRemove` | `` | `LibreMetaverse.Tests/InventoryTests.cs:219` | `` | `` | `pending source translation` | `pending` | `cfe6571887d0e992ff4d69ccbcdfb34012f9bb5d62118201c33d7d66cc9ddfd8` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.MovingItemUpdatesAncestorDescendentCounts::test` | `InventoryTests.MovingItemUpdatesAncestorDescendentCounts` | `` | `LibreMetaverse.Tests/InventoryTests.cs:247` | `` | `` | `pending source translation` | `pending` | `1f4b4189694b9471d48562a434c91a9e455706b83b65bb855c0846388b44c759` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.ConcurrentAddMoveRemoveStress::test` | `InventoryTests.ConcurrentAddMoveRemoveStress` | `` | `LibreMetaverse.Tests/InventoryTests.cs:283` | `` | `` | `pending source translation` | `pending` | `0b76b2fb62a6300e02a02859772f146f107caa77986f4d593e3a4d01966ab4e4` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.ConcurrentLinkAddRemoveStress::test` | `InventoryTests.ConcurrentLinkAddRemoveStress` | `` | `LibreMetaverse.Tests/InventoryTests.cs:373` | `` | `` | `pending source translation` | `pending` | `eef3b4eb300427800757dc6cac2dbd9202ed1cf1aac42565b3c26eb11e71bbf1` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.LinkIndexUpdateOnAssetChange::test` | `InventoryTests.LinkIndexUpdateOnAssetChange` | `` | `LibreMetaverse.Tests/InventoryTests.cs:439` | `` | `` | `pending source translation` | `pending` | `d3e0066e06ab1c48520e5e0bbba8069b74f1a38d37e24d914392406b41b2ea0c` |
| `LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibraryFoldersArePopulatedAfterLogin::test` | `LibraryInventoryTests.LibraryFoldersArePopulatedAfterLogin` | `` | `LibreMetaverse.Tests/LibraryInventoryTests.cs:109` | `Inventory, RequiresLiveServer` | `` | `pending source translation` | `pending` | `dc865c88bb514bb71157a451e938b5ae3e3adde208d267d6a7196706dc9cfda2` |
| `LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibraryFolderItemsCanBeFetched::test` | `LibraryInventoryTests.LibraryFolderItemsCanBeFetched` | `` | `LibreMetaverse.Tests/LibraryInventoryTests.cs:146` | `Inventory, RequiresLiveServer` | `` | `pending source translation` | `pending` | `475561d29dd25aba52d94f8374fe9083fea2ed7af44dfb6d25b55ce487b080ab` |
| `LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibrarySubFolderContainsItems::test` | `LibraryInventoryTests.LibrarySubFolderContainsItems` | `` | `LibreMetaverse.Tests/LibraryInventoryTests.cs:219` | `Inventory, RequiresLiveServer` | `` | `pending source translation` | `pending` | `a6d02cbcb7fde8248419f1cf7355c3d37f06e8b365dc483fad935dd9a0ac5909` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_ObjectAsset_ResultsInAttachmentInventoryTypeAndParsesFields::test` | `InventoryAISClientTests.ParseLinksFromEmbedded_ObjectAsset_ResultsInAttachmentInventoryTypeAndParsesFields` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:37` | `` | `` | `tests/compat/tests/inventory_ais_semantics.rs:129 (`parse_links_object_asset_results_in_attachment_type_and_parses_fields`)` | `translated` | `3ae365ed34f12d036dcd44c94f8568d163cfeec2a58b4975975b77b418770131` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_ItemsKey_ParsesConcreteItems::test` | `InventoryAISClientTests.ParseItemsFromEmbedded_ItemsKey_ParsesConcreteItems` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:82` | `` | `` | `tests/compat/tests/inventory_ais_semantics.rs:160 (`parse_items_items_key_parses_concrete_items`)` | `translated` | `d9e7c64106639071e1ec6ada7346bfa050a31183becaac79efefcd4755fe2855` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_MeshAsset_TreatedAsAttachment::test` | `InventoryAISClientTests.ParseLinksFromEmbedded_MeshAsset_TreatedAsAttachment` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:122` | `` | `` | `tests/compat/tests/inventory_ais_semantics.rs:182 (`parse_links_mesh_asset_treated_as_attachment`)` | `translated` | `f807110d577c654128dd8d42e618c610c260c4f3367cf2795776564409f876a2` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_TopLevelItemsKey_WorksWithoutEmbedded::test` | `InventoryAISClientTests.ParseItemsFromEmbedded_TopLevelItemsKey_WorksWithoutEmbedded` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:160` | `` | `` | `tests/compat/tests/inventory_ais_semantics.rs:211 (`parse_items_top_level_items_key_works_without_embedded`)` | `translated` | `9c8f2090d59ff5e75e75381a7283c501cadd56e591991cdead23c504738a0a6d` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_TopLevelLinksKey_WorksWithoutEmbedded::test` | `InventoryAISClientTests.ParseLinksFromEmbedded_TopLevelLinksKey_WorksWithoutEmbedded` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:193` | `` | `` | `tests/compat/tests/inventory_ais_semantics.rs:226 (`parse_links_top_level_links_key_works_without_embedded`)` | `translated` | `29afd2bd6a554959d6cfa99b632672d56bbb5bcad2ccbaf8caf4773a514f5d79` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_NullOrEmpty_ReturnsEmptyList::test` | `InventoryAISClientTests.ParseItemsFromEmbedded_NullOrEmpty_ReturnsEmptyList` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:227` | `` | `` | `tests/compat/tests/inventory_ais_semantics.rs:248 (`parse_items_null_or_empty_returns_empty_list`)` | `translated` | `198fb619bbf396a4b1a7b4b85b7fba8808ae127e2575b2b84d21f01a2bdbc445` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseEmbedded_CombinesItemsAndLinks::test` | `InventoryAISClientTests.ParseEmbedded_CombinesItemsAndLinks` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:236` | `` | `` | `tests/compat/tests/inventory_ais_semantics.rs:264 (`parse_embedded_combines_items_and_links`)` | `translated` | `f2ebf4638c9aef3c846dc182d97d80c95118799428cf8c2bba86163e33196846` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.MoveCategoryLinksAsync_AlwaysReturnsFalse::test` | `InventoryAISClientTests.MoveCategoryLinksAsync_AlwaysReturnsFalse` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:259` | `` | `` | `tests/compat/tests/inventory_ais_semantics.rs:284 (`move_category_links_always_returns_false`)` | `translated` | `bebad05897efc0da2f959b4f567faa3ffee950520d13265ecbab1dee978f4886` |
| `LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.MoveCategoryLinksAsync_ReturnsCompletedTask::test` | `InventoryAISClientTests.MoveCategoryLinksAsync_ReturnsCompletedTask` | `` | `LibreMetaverse.Tests/InventoryAISClientTests.cs:268` | `` | `` | `tests/compat/tests/inventory_ais_semantics.rs:292 (`move_category_links_returns_completed_future`)` | `translated` | `f9830b11e6a75c90f8394a5ade56bbd542c140be4c050ba7db6c9ee4d2b7a699` |
| `LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventorySkeletonIsPopulatedAfterLogin::test` | `InventoryFetchTests.InventorySkeletonIsPopulatedAfterLogin` | `` | `LibreMetaverse.Tests/InventoryFetchTests.cs:109` | `Inventory, RequiresLiveServer` | `` | `tests/compat/tests/inventory_live_semantics.rs:88 (`inventory_skeleton_is_populated_after_login`)` | `ignored-live` | `ea1508e3c676639f00bb8a4c4c72d2ee668603bfbff40ee0b93d7f4beb607f75` |
| `LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryRootContainsFolders::test` | `InventoryFetchTests.InventoryRootContainsFolders` | `` | `LibreMetaverse.Tests/InventoryFetchTests.cs:147` | `Inventory, RequiresLiveServer` | `` | `tests/compat/tests/inventory_live_semantics.rs:109 (`inventory_root_contains_folders`)` | `ignored-live` | `71f41c718060622e1fd653e6b0fc9fe65f3cd68cab3d128f494cdbc90f9d2726` |
| `LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryFolderContainsItems::test` | `InventoryFetchTests.InventoryFolderContainsItems` | `` | `LibreMetaverse.Tests/InventoryFetchTests.cs:194` | `Inventory, RequiresLiveServer` | `` | `tests/compat/tests/inventory_live_semantics.rs:143 (`inventory_folder_contains_items`)` | `ignored-live` | `f0d77649b82d4d7d7778acebd851dd4eb44b76eb687af07bccdd20a1efe96223` |
| `LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryItemCanBeFetchedById::test` | `InventoryFetchTests.InventoryItemCanBeFetchedById` | `` | `LibreMetaverse.Tests/InventoryFetchTests.cs:276` | `Inventory, RequiresLiveServer` | `` | `tests/compat/tests/inventory_live_semantics.rs:196 (`inventory_item_can_be_fetched_by_id`)` | `ignored-live` | `7fe89086754a673ab69814202b48aab9add30dd63ee98a953bdedd54d6788af2` |
| `LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.EncryptDecrypt_RoundTrip::test` | `InventoryManagerTests.EncryptDecrypt_RoundTrip` | `` | `LibreMetaverse.Tests/InventoryManagerTests.cs:35` | `` | `` | `tests/compat/tests/inventory_manager_semantics.rs:25 (`encrypt_decrypt_round_trip`)` | `translated` | `7b59c330ffacf1174dd884f369a4e4015e1a212a0e43d7fa8889f7505dd5599d` |
| `LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.ItemCRC_IsDeterministic_AndChangesWhenFieldsChange::test` | `InventoryManagerTests.ItemCRC_IsDeterministic_AndChangesWhenFieldsChange` | `` | `LibreMetaverse.Tests/InventoryManagerTests.cs:45` | `` | `` | `tests/compat/tests/inventory_manager_semantics.rs:34 (`item_crc_is_deterministic_and_changes_when_fields_change`)` | `translated` | `dbd322778ad7f110abce5f10a0c83ad002ae76f6a114fa795fb90a799f4ff077` |
| `LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.CreateInventoryItem_ReturnsCorrectSubclass::test` | `InventoryManagerTests.CreateInventoryItem_ReturnsCorrectSubclass` | `` | `LibreMetaverse.Tests/InventoryManagerTests.cs:77` | `` | `` | `tests/compat/tests/inventory_manager_semantics.rs:60 (`create_inventory_item_returns_correct_subclass`)` | `translated` | `219f8c91bc1b3d5b5d3e5b2f2880c5733fd02e6103ccc9c6ecbf8d03328274f6` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.AddAndGetItem::test` | `InventoryTests.AddAndGetItem` | `` | `LibreMetaverse.Tests/InventoryTests.cs:53` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:72 (`add_and_get_item`)` | `translated` | `24702f0cf9215beee29123ee81dab4a7fe971beb197ecceac9a1761b695bce45` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateItemParent::test` | `InventoryTests.UpdateItemParent` | `` | `LibreMetaverse.Tests/InventoryTests.cs:76` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:103 (`update_item_parent`)` | `translated` | `ea1a73e28fb92b873ee28102e81811d769b5cd815d2e1d756ece6ea635e5c014` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.InventoryNodeModifyTime_SelfLoop::test` | `InventoryTests.InventoryNodeModifyTime_SelfLoop` | `` | `LibreMetaverse.Tests/InventoryTests.cs:98` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:141 (`inventory_node_modify_time_self_loop`)` | `translated` | `f8050cc284f7954c1301091ddc1cbf0fa76073806eee7de4f6cb21063591fbf1` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateNodeFor_SelfLoop::test` | `InventoryTests.UpdateNodeFor_SelfLoop` | `` | `LibreMetaverse.Tests/InventoryTests.cs:109` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:152 (`update_node_for_self_loop`)` | `translated` | `14f42e5263c465e8534347c5a3195c195e2d90371dbc2f69d36a40362384505c` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateNodeFor_ComplexSelfLoop::test` | `InventoryTests.UpdateNodeFor_ComplexSelfLoop` | `` | `LibreMetaverse.Tests/InventoryTests.cs:120` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:164 (`update_node_for_complex_self_loop`)` | `translated` | `a2fc7b29b8a7a7767c42ea9c7fb9628451c88991c3eb1ecbd2ce0952ab0b5700` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.RemoveItem::test` | `InventoryTests.RemoveItem` | `` | `LibreMetaverse.Tests/InventoryTests.cs:136` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:182 (`remove_item`)` | `translated` | `1e72f9049b9114f0c56e152d84190d31bca7a862f7ad1459624d753beb6818b4` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.SaveAndRestoreAsync::test` | `InventoryTests.SaveAndRestoreAsync` | `` | `LibreMetaverse.Tests/InventoryTests.cs:150` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:197 (`save_and_restore_async`)` | `translated` | `bf23b1c67cc9618713d2d8e6653f0ffbbf4c24d7f2c59c5dd639047f7e0c8156` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.GetNodeOrDefault_ReturnsNullWhenMissing::test` | `InventoryTests.GetNodeOrDefault_ReturnsNullWhenMissing` | `` | `LibreMetaverse.Tests/InventoryTests.cs:175` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:227 (`get_node_or_default_returns_null_when_missing`)` | `translated` | `f5651b5a143470c3ab6ba1f835206a1a55a6218c28242dc12c5d6b5e89519596` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.TryGetValue_Generic::test` | `InventoryTests.TryGetValue_Generic` | `` | `LibreMetaverse.Tests/InventoryTests.cs:182` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:239 (`try_get_value_generic`)` | `translated` | `e6f6d6535af9d011e65cb3c297fe99543f85b64382c47e1756f051d6031886f5` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.RemoveFolderRemovesAllDescendants::test` | `InventoryTests.RemoveFolderRemovesAllDescendants` | `` | `LibreMetaverse.Tests/InventoryTests.cs:196` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:259 (`remove_folder_removes_all_descendants`)` | `translated` | `b537223d271b75c11adfa6d87c1e79bb29366f294657ddf71f236fab0dee009f` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.DescendentCountUpdatesOnAddAndRemove::test` | `InventoryTests.DescendentCountUpdatesOnAddAndRemove` | `` | `LibreMetaverse.Tests/InventoryTests.cs:219` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:282 (`descendent_count_updates_on_add_and_remove`)` | `translated` | `cfe6571887d0e992ff4d69ccbcdfb34012f9bb5d62118201c33d7d66cc9ddfd8` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.MovingItemUpdatesAncestorDescendentCounts::test` | `InventoryTests.MovingItemUpdatesAncestorDescendentCounts` | `` | `LibreMetaverse.Tests/InventoryTests.cs:247` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:311 (`moving_item_updates_ancestor_descendent_counts`)` | `translated` | `1f4b4189694b9471d48562a434c91a9e455706b83b65bb855c0846388b44c759` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.ConcurrentAddMoveRemoveStress::test` | `InventoryTests.ConcurrentAddMoveRemoveStress` | `` | `LibreMetaverse.Tests/InventoryTests.cs:283` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:357 (`concurrent_add_move_remove_stress`)` | `translated` | `0b76b2fb62a6300e02a02859772f146f107caa77986f4d593e3a4d01966ab4e4` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.ConcurrentLinkAddRemoveStress::test` | `InventoryTests.ConcurrentLinkAddRemoveStress` | `` | `LibreMetaverse.Tests/InventoryTests.cs:373` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:440 (`concurrent_link_add_remove_stress`)` | `translated` | `eef3b4eb300427800757dc6cac2dbd9202ed1cf1aac42565b3c26eb11e71bbf1` |
| `LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.LinkIndexUpdateOnAssetChange::test` | `InventoryTests.LinkIndexUpdateOnAssetChange` | `` | `LibreMetaverse.Tests/InventoryTests.cs:439` | `` | `` | `tests/compat/tests/inventory_store_semantics.rs:517 (`link_index_updates_on_asset_change`)` | `translated` | `d3e0066e06ab1c48520e5e0bbba8069b74f1a38d37e24d914392406b41b2ea0c` |
| `LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibraryFoldersArePopulatedAfterLogin::test` | `LibraryInventoryTests.LibraryFoldersArePopulatedAfterLogin` | `` | `LibreMetaverse.Tests/LibraryInventoryTests.cs:109` | `Inventory, RequiresLiveServer` | `` | `tests/compat/tests/inventory_live_semantics.rs:249 (`library_folders_are_populated_after_login`)` | `ignored-live` | `dc865c88bb514bb71157a451e938b5ae3e3adde208d267d6a7196706dc9cfda2` |
| `LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibraryFolderItemsCanBeFetched::test` | `LibraryInventoryTests.LibraryFolderItemsCanBeFetched` | `` | `LibreMetaverse.Tests/LibraryInventoryTests.cs:146` | `Inventory, RequiresLiveServer` | `` | `tests/compat/tests/inventory_live_semantics.rs:275 (`library_folder_items_can_be_fetched`)` | `ignored-live` | `475561d29dd25aba52d94f8374fe9083fea2ed7af44dfb6d25b55ce487b080ab` |
| `LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibrarySubFolderContainsItems::test` | `LibraryInventoryTests.LibrarySubFolderContainsItems` | `` | `LibreMetaverse.Tests/LibraryInventoryTests.cs:219` | `Inventory, RequiresLiveServer` | `` | `tests/compat/tests/inventory_live_semantics.rs:309 (`library_sub_folder_contains_items`)` | `ignored-live` | `a6d02cbcb7fde8248419f1cf7355c3d37f06e8b365dc483fad935dd9a0ac5909` |
| `LibreMetaverse.Tests/LindenSkeletonTests.cs::LindenSkeletonTests.BuildExpandedJointList_EmptyFilter_ReturnsEmptyList::test` | `LindenSkeletonTests.BuildExpandedJointList_EmptyFilter_ReturnsEmptyList` | `` | `LibreMetaverse.Tests/LindenSkeletonTests.cs:58` | `LindenSkeleton` | `` | `crates/libremetaverse/src/avatar_animesh_semantics.rs:642 (`linden_skeleton_build_expanded_joint_list_empty_filter_returns_empty_list`)` | `translated` | `59857e0c12d374a3063e98311f7d262ca9e4fe3bde43af4698d20a6e6e550a64` |
| `LibreMetaverse.Tests/LindenSkeletonTests.cs::LindenSkeletonTests.BuildExpandedJointList_NoBoneChildren_ReturnsEmptyList::test` | `LindenSkeletonTests.BuildExpandedJointList_NoBoneChildren_ReturnsEmptyList` | `` | `LibreMetaverse.Tests/LindenSkeletonTests.cs:70` | `LindenSkeleton` | `` | `crates/libremetaverse/src/avatar_animesh_semantics.rs:655 (`linden_skeleton_build_expanded_joint_list_no_bone_children_returns_empty_list`)` | `translated` | `c744ad17de5b5dd0e594973181307ddaba0d9b0ecf0ce3ff258e108de45e82be` |
| `LibreMetaverse.Tests/LindenSkeletonTests.cs::LindenSkeletonTests.BuildExpandedJointList_LinearChain_AllInFilter_ProducesCorrectSequence::test` | `LindenSkeletonTests.BuildExpandedJointList_LinearChain_AllInFilter_ProducesCorrectSequence` | `` | `LibreMetaverse.Tests/LindenSkeletonTests.cs:80` | `LindenSkeleton` | `` | `crates/libremetaverse/src/avatar_animesh_semantics.rs:669 (`linden_skeleton_build_expanded_joint_list_linear_chain_all_in_filter`)` | `translated` | `c2fa9fc02df25cb6eb083746a100abf551d208ea036cadb26a1e94649d33e560` |
@@ -425,14 +425,14 @@ Reviewed Rust tests live outside `generated_parity.rs` and carry a `parity-case`
| `LibreMetaverse.Tests/MessageTests.cs::MessageTests.ReflectionPerformanceDirLandReply::test` | `MessageTests.ReflectionPerformanceDirLandReply` | `` | `LibreMetaverse.Tests/MessageTests.cs:1291` | `Benchmark` | `` | `tests/compat/tests/wire_semantics.rs:1515 (`reflection_performance_dir_land_reply`)` | `benchmark` | `d4a40f5d6a5f3e66d69591429bea0cfc95d313afc9a7a9ee5e9289c69be069d6` |
| `LibreMetaverse.Tests/MessageTests.cs::MessageTests.ReflectionPerformanceDirLandReply2::test` | `MessageTests.ReflectionPerformanceDirLandReply2` | `` | `LibreMetaverse.Tests/MessageTests.cs:1354` | `Benchmark` | `` | `tests/compat/tests/wire_semantics.rs:1573 (`reflection_performance_dir_land_reply_two`)` | `benchmark` | `e52dacbdf3f4540553fe9f751334631a2d8440bdffcf6822d2629585176626cc` |
| `LibreMetaverse.Tests/MessageTests.cs::MessageTests.ReflectionPerformanceParcelProperties::test` | `MessageTests.ReflectionPerformanceParcelProperties` | `` | `LibreMetaverse.Tests/MessageTests.cs:1420` | `Benchmark` | `` | `tests/compat/tests/wire_semantics.rs:1732 (`reflection_performance_parcel_properties`)` | `benchmark` | `914e6015a8abc1b5c1b58a219ef4f67258f793cac02c903e518758deaaddf8a4` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.IsLink_TextureItemWithLinkAssetType_ReturnsTrue::test` | `MisclassifiedLinkRegressionTests.IsLink_TextureItemWithLinkAssetType_ReturnsTrue` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:75` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:22 (`is_link_texture_item_with_link_asset_type_returns_true`)` | `translated` | `b85452466c0fdc47a44cc08166f93a660bbf466b0e2205910c1ea84fee22896c` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.IsLink_NormalTexture_ReturnsFalse::test` | `MisclassifiedLinkRegressionTests.IsLink_NormalTexture_ReturnsFalse` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:90` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:29 (`is_link_normal_texture_returns_false`)` | `translated` | `8c08505d6e89c4395115dbb060529419755aa1a81ca8889804ea00e6f94bf534` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.ResolvedItemID_OnMisclassifiedTextureLink_ReturnsAssetUUID::test` | `MisclassifiedLinkRegressionTests.ResolvedItemID_OnMisclassifiedTextureLink_ReturnsAssetUUID` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:103` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:38 (`resolved_item_id_on_misclassified_texture_link_returns_asset_uuid`)` | `translated` | `cad5b5fb10523254ff19b7842b0e48984bc75182a26bc897f165a43770bb47f4` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.InventoryStore_Contains_FindsTargetByResolvedItemID::test` | `MisclassifiedLinkRegressionTests.InventoryStore_Contains_FindsTargetByResolvedItemID` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:120` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:46 (`inventory_store_contains_finds_target_by_resolved_item_id`)` | `translated` | `3c1f8596462c3a9e229c84ea44e44728bf175e1a0e8213ae92d1b02b08320b0b` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsWearable_WhenTargetIsWearable::test` | `MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsWearable_WhenTargetIsWearable` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:142` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:64 (`inventory_store_indexer_returns_wearable_when_target_is_wearable`)` | `translated` | `c7ce0b860743cfa5225de4322c8d7bf95094296b1dd2d07fd273bbd4e81a9fcf` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsAttachment_WhenTargetIsAttachment::test` | `MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsAttachment_WhenTargetIsAttachment` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:168` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:86 (`inventory_store_indexer_returns_attachment_when_target_is_attachment`)` | `translated` | `f58debff8f66b7b417215eb6879f96935647b66cc619fdb00e6815c9ce5e7c67` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsObject_WhenTargetIsObject::test` | `MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsObject_WhenTargetIsObject` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:192` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:110 (`inventory_store_indexer_returns_object_when_target_is_object`)` | `translated` | `b8137c994019103977b0b85d8c148e12ae8f9051334ca487db7c88bcbe707d40` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.InventoryStore_NotContains_WhenTargetAbsent::test` | `MisclassifiedLinkRegressionTests.InventoryStore_NotContains_WhenTargetAbsent` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:216` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:132 (`inventory_store_not_contains_when_target_absent`)` | `translated` | `6900e220c33ec135d02c55e047c7052a095d5dd9d71da4a857ae70bc151c472b` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.IsLink_TextureItemWithLinkAssetType_ReturnsTrue::test` | `MisclassifiedLinkRegressionTests.IsLink_TextureItemWithLinkAssetType_ReturnsTrue` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:75` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:26 (`is_link_texture_item_with_link_asset_type_returns_true`)` | `translated` | `b85452466c0fdc47a44cc08166f93a660bbf466b0e2205910c1ea84fee22896c` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.IsLink_NormalTexture_ReturnsFalse::test` | `MisclassifiedLinkRegressionTests.IsLink_NormalTexture_ReturnsFalse` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:90` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:33 (`is_link_normal_texture_returns_false`)` | `translated` | `8c08505d6e89c4395115dbb060529419755aa1a81ca8889804ea00e6f94bf534` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.ResolvedItemID_OnMisclassifiedTextureLink_ReturnsAssetUUID::test` | `MisclassifiedLinkRegressionTests.ResolvedItemID_OnMisclassifiedTextureLink_ReturnsAssetUUID` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:103` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:42 (`resolved_item_id_on_misclassified_texture_link_returns_asset_uuid`)` | `translated` | `cad5b5fb10523254ff19b7842b0e48984bc75182a26bc897f165a43770bb47f4` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.InventoryStore_Contains_FindsTargetByResolvedItemID::test` | `MisclassifiedLinkRegressionTests.InventoryStore_Contains_FindsTargetByResolvedItemID` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:120` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:50 (`inventory_store_contains_finds_target_by_resolved_item_id`)` | `translated` | `3c1f8596462c3a9e229c84ea44e44728bf175e1a0e8213ae92d1b02b08320b0b` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsWearable_WhenTargetIsWearable::test` | `MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsWearable_WhenTargetIsWearable` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:142` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:68 (`inventory_store_indexer_returns_wearable_when_target_is_wearable`)` | `translated` | `c7ce0b860743cfa5225de4322c8d7bf95094296b1dd2d07fd273bbd4e81a9fcf` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsAttachment_WhenTargetIsAttachment::test` | `MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsAttachment_WhenTargetIsAttachment` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:168` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:90 (`inventory_store_indexer_returns_attachment_when_target_is_attachment`)` | `translated` | `f58debff8f66b7b417215eb6879f96935647b66cc619fdb00e6815c9ce5e7c67` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsObject_WhenTargetIsObject::test` | `MisclassifiedLinkRegressionTests.InventoryStore_Indexer_ReturnsObject_WhenTargetIsObject` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:192` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:114 (`inventory_store_indexer_returns_object_when_target_is_object`)` | `translated` | `b8137c994019103977b0b85d8c148e12ae8f9051334ca487db7c88bcbe707d40` |
| `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs::MisclassifiedLinkRegressionTests.InventoryStore_NotContains_WhenTargetAbsent::test` | `MisclassifiedLinkRegressionTests.InventoryStore_NotContains_WhenTargetAbsent` | `` | `LibreMetaverse.Tests/MisclassifiedLinkRegressionTests.cs:216` | `Inventory` | `` | `tests/compat/tests/misclassified_link_semantics.rs:136 (`inventory_store_not_contains_when_target_absent`)` | `translated` | `6900e220c33ec135d02c55e047c7052a095d5dd9d71da4a857ae70bc151c472b` |
| `LibreMetaverse.Tests/NetworkTests.cs::NetworkTests.DetectObjects::test` | `NetworkTests.DetectObjects` | `` | `LibreMetaverse.Tests/NetworkTests.cs:121` | `Network, RequiresLiveServer` | `` | `tests/compat/tests/network_semantics.rs:409 (`detect_objects_live`)` | `ignored-live` | `8b72f1ca30feda2fad0812faf3a2f83d691d3cca9268054b3cc3bf89ad786e87` |
| `LibreMetaverse.Tests/NetworkTests.cs::NetworkTests.CapsQueue::test` | `NetworkTests.CapsQueue` | `` | `LibreMetaverse.Tests/NetworkTests.cs:188` | `Network, RequiresLiveServer` | `` | `tests/compat/tests/network_semantics.rs:488 (`caps_queue_live`)` | `ignored-live` | `cd5af4e7d69df3e938540711877d167fe28efb9af8af7518a62b8f406e46cc18` |
| `LibreMetaverse.Tests/NotationLLSDTests.cs::NotationSDTests.HelperFunctions::test` | `NotationSDTests.HelperFunctions` | `` | `LibreMetaverse.Tests/NotationLLSDTests.cs:53` | `` | `` | `tests/compat/tests/structured_data.rs:622 (`notation_helper_functions`)` | `translated` | `a521ca5407ed3afd1d59f5b65a283bcebe9d34b4c384d68c5fc674b3a1eeb9df` |
@@ -1129,10 +1129,10 @@ Reviewed Rust tests live outside `generated_parity.rs` and carry a `parity-case`
| `LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.SetRegionRestartScheduleAsync_EmptyDaysClearsSchedule::test` | `RegionScheduleTests.SetRegionRestartScheduleAsync_EmptyDaysClearsSchedule` | `` | `LibreMetaverse.Tests/RegionScheduleTests.cs:157` | `Estate` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `57ef3c0f8d9eeac58a7d1b3e7dbc44413016f39303d304cacd3071bd2c55f320` |
| `LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.SetRegionRestartScheduleAsync_NoCapability_ReturnsFalseWithoutRequest::test` | `RegionScheduleTests.SetRegionRestartScheduleAsync_NoCapability_ReturnsFalseWithoutRequest` | `` | `LibreMetaverse.Tests/RegionScheduleTests.cs:177` | `Estate` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `be03507fe574b9f7c7174c39af44b7b693e1b7a496845db46451ef09bf9db206` |
| `LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.SetRegionRestartScheduleAsync_NonSuccessStatus_ReturnsFalse::test` | `RegionScheduleTests.SetRegionRestartScheduleAsync_NonSuccessStatus_ReturnsFalse` | `` | `LibreMetaverse.Tests/RegionScheduleTests.cs:195` | `Estate` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `16c8988d7aa15ea9f58deaa2e3f416b6115978e23073fd99749843f4f410dca4` |
| `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_CapAvailable_ReturnsContentsFolderAndDecryptsShadowId::test` | `RequestTaskInventoryCapTests.GetTaskInventoryAsync_CapAvailable_ReturnsContentsFolderAndDecryptsShadowId` | `` | `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs:73` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `c9bfc5526260f9e2dffa8a22938999911fdd80be4b2b6d6487bf6171f8dbb56a` |
| `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_PlainAssetId_ParsesWithoutDecryption::test` | `RequestTaskInventoryCapTests.GetTaskInventoryAsync_PlainAssetId_ParsesWithoutDecryption` | `` | `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs:115` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `95f39928dae61bca86b7d0a0702307db6c5fdc754e51f73a24bd5ee131e6de3f` |
| `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_NonSuccessStatus_ReturnsContentsFolderOnly::test` | `RequestTaskInventoryCapTests.GetTaskInventoryAsync_NonSuccessStatus_ReturnsContentsFolderOnly` | `` | `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs:143` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `b8a25891064e470ac8d77ecd8a4847cf773b043de5ebeae275a9dd6669518585` |
| `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_NoCapability_DoesNotMakeHttpRequest::test` | `RequestTaskInventoryCapTests.GetTaskInventoryAsync_NoCapability_DoesNotMakeHttpRequest` | `` | `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs:164` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `c0c43ebcf781fb81b1fef7ce1dd2774e350d92ef882f49876f1a16d23a338592` |
| `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_CapAvailable_ReturnsContentsFolderAndDecryptsShadowId::test` | `RequestTaskInventoryCapTests.GetTaskInventoryAsync_CapAvailable_ReturnsContentsFolderAndDecryptsShadowId` | `` | `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs:73` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `tests/compat/tests/task_inventory_semantics.rs:138 (`cap_available_returns_contents_folder_and_decrypts_shadow_id`)` | `translated` | `c9bfc5526260f9e2dffa8a22938999911fdd80be4b2b6d6487bf6171f8dbb56a` |
| `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_PlainAssetId_ParsesWithoutDecryption::test` | `RequestTaskInventoryCapTests.GetTaskInventoryAsync_PlainAssetId_ParsesWithoutDecryption` | `` | `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs:115` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `tests/compat/tests/task_inventory_semantics.rs:176 (`plain_asset_id_parses_without_decryption`)` | `translated` | `95f39928dae61bca86b7d0a0702307db6c5fdc754e51f73a24bd5ee131e6de3f` |
| `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_NonSuccessStatus_ReturnsContentsFolderOnly::test` | `RequestTaskInventoryCapTests.GetTaskInventoryAsync_NonSuccessStatus_ReturnsContentsFolderOnly` | `` | `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs:143` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `tests/compat/tests/task_inventory_semantics.rs:196 (`non_success_status_returns_contents_folder_only`)` | `translated` | `b8a25891064e470ac8d77ecd8a4847cf773b043de5ebeae275a9dd6669518585` |
| `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_NoCapability_DoesNotMakeHttpRequest::test` | `RequestTaskInventoryCapTests.GetTaskInventoryAsync_NoCapability_DoesNotMakeHttpRequest` | `` | `LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs:164` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `tests/compat/tests/task_inventory_semantics.rs:211 (`no_capability_does_not_make_http_request`)` | `translated` | `c0c43ebcf781fb81b1fef7ce1dd2774e350d92ef882f49876f1a16d23a338592` |
| `LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_HappyPath_PostsMetadataThenImageAndReturnsTrue::test` | `SendPostcardTests.SendPostcardAsync_HappyPath_PostsMetadataThenImageAndReturnsTrue` | `` | `LibreMetaverse.Tests/SendPostcardTests.cs:68` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `tests/compat/tests/asset_capability_semantics.rs:548 (`postcard_posts_metadata_then_image`)` | `translated` | `2e02bd16ef1431c2ca82d7804dffc764be0175cff5daff8c38d0a61641439e06` |
| `LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_UploaderMissingFromResponse_ReturnsFalseWithoutSecondRequest::test` | `SendPostcardTests.SendPostcardAsync_UploaderMissingFromResponse_ReturnsFalseWithoutSecondRequest` | `` | `LibreMetaverse.Tests/SendPostcardTests.cs:100` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `tests/compat/tests/asset_capability_semantics.rs:586 (`postcard_missing_uploader_returns_false_after_one_request`)` | `translated` | `2f9498d57d7a512399f9b108765e6e8da8e4c937402f9671d580c66332630432` |
| `LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_UploadDoesNotComplete_ReturnsFalse::test` | `SendPostcardTests.SendPostcardAsync_UploadDoesNotComplete_ReturnsFalse` | `` | `LibreMetaverse.Tests/SendPostcardTests.cs:112` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `tests/compat/tests/asset_capability_semantics.rs:608 (`postcard_incomplete_upload_returns_false`)` | `translated` | `937b682b406506ec9fba9570852bbf8689450a11cbecb85979af97609b1794f9` |

View File

@@ -2,9 +2,7 @@
// Source: LibreMetaverse 2aa70bb68513b39795da5d13c88f31b86e85a3ba
// Pending cases are catalog entries, not fake executable Rust tests.
// pending-parity-case: LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.InventoryAISClient_Null_Throws::test ac92e375efc45c50b37e6c82aea372d605fceb470ce053a025e05ff47a5c7121
// pending-parity-case: LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.GridManager_Null_Throws::test e972a95f334b0f46948cda34c27124c28c44faf4372d0e598d7dc60050b49be4
// pending-parity-case: LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.InventoryManager_Null_Throws::test 5e7498066c944800354abbc71eea825fe90d0c40a25a6065967a3ebcc9efea74
// pending-parity-case: LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.AppearanceManager_Null_Throws::test a3c872805bc924b5a1a9441d5c9eb61ed6d6e9477e4bb411131359290b144ab4
// pending-parity-case: LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.ObjectManager_Null_Throws::test 8a11feba0edfb35e5dd99f681182e8f5a5cf8a3f738211b45a683a8a2ad45ddb
// pending-parity-case: LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.AgentManager_Null_Throws::test d86e41b6cdd03063685aa330c31b9a274c1d400b9a461abf3065fe185fe0bbf0
@@ -28,40 +26,6 @@
// pending-parity-case: LibreMetaverse.Tests/ExperiencePreferencesMessageTests.cs::ExperiencePreferencesMessageTests.ExtractExperiencePermission_Allowed_ReturnsAllow::test cf095ab428713004ebac6e1915a47ae0c03bd2958addbba2a39fd2f0edf51a74
// pending-parity-case: LibreMetaverse.Tests/ExperiencePreferencesMessageTests.cs::ExperiencePreferencesMessageTests.ExtractExperiencePermission_Blocked_ReturnsBlock::test af084d1ab7a11079e6251865e8fd5aecfde38d2df359ebc1e208bc74925935c0
// pending-parity-case: LibreMetaverse.Tests/ExperiencePreferencesMessageTests.cs::ExperiencePreferencesMessageTests.ExtractExperiencePermission_NeitherList_ReturnsForget::test 93204469ecfec2f3f4eb6838c99f6e2baf09bf76a075958d1ed369ba03767158
// pending-parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_ObjectAsset_ResultsInAttachmentInventoryTypeAndParsesFields::test 3ae365ed34f12d036dcd44c94f8568d163cfeec2a58b4975975b77b418770131
// pending-parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_ItemsKey_ParsesConcreteItems::test d9e7c64106639071e1ec6ada7346bfa050a31183becaac79efefcd4755fe2855
// pending-parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_MeshAsset_TreatedAsAttachment::test f807110d577c654128dd8d42e618c610c260c4f3367cf2795776564409f876a2
// pending-parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_TopLevelItemsKey_WorksWithoutEmbedded::test 9c8f2090d59ff5e75e75381a7283c501cadd56e591991cdead23c504738a0a6d
// pending-parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_TopLevelLinksKey_WorksWithoutEmbedded::test 29afd2bd6a554959d6cfa99b632672d56bbb5bcad2ccbaf8caf4773a514f5d79
// pending-parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_NullOrEmpty_ReturnsEmptyList::test 198fb619bbf396a4b1a7b4b85b7fba8808ae127e2575b2b84d21f01a2bdbc445
// pending-parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseEmbedded_CombinesItemsAndLinks::test f2ebf4638c9aef3c846dc182d97d80c95118799428cf8c2bba86163e33196846
// pending-parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.MoveCategoryLinksAsync_AlwaysReturnsFalse::test bebad05897efc0da2f959b4f567faa3ffee950520d13265ecbab1dee978f4886
// pending-parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.MoveCategoryLinksAsync_ReturnsCompletedTask::test f9830b11e6a75c90f8394a5ade56bbd542c140be4c050ba7db6c9ee4d2b7a699
// pending-parity-case: LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventorySkeletonIsPopulatedAfterLogin::test ea1508e3c676639f00bb8a4c4c72d2ee668603bfbff40ee0b93d7f4beb607f75
// pending-parity-case: LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryRootContainsFolders::test 71f41c718060622e1fd653e6b0fc9fe65f3cd68cab3d128f494cdbc90f9d2726
// pending-parity-case: LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryFolderContainsItems::test f0d77649b82d4d7d7778acebd851dd4eb44b76eb687af07bccdd20a1efe96223
// pending-parity-case: LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryItemCanBeFetchedById::test 7fe89086754a673ab69814202b48aab9add30dd63ee98a953bdedd54d6788af2
// pending-parity-case: LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.EncryptDecrypt_RoundTrip::test 7b59c330ffacf1174dd884f369a4e4015e1a212a0e43d7fa8889f7505dd5599d
// pending-parity-case: LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.ItemCRC_IsDeterministic_AndChangesWhenFieldsChange::test dbd322778ad7f110abce5f10a0c83ad002ae76f6a114fa795fb90a799f4ff077
// pending-parity-case: LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.CreateInventoryItem_ReturnsCorrectSubclass::test 219f8c91bc1b3d5b5d3e5b2f2880c5733fd02e6103ccc9c6ecbf8d03328274f6
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.AddAndGetItem::test 24702f0cf9215beee29123ee81dab4a7fe971beb197ecceac9a1761b695bce45
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateItemParent::test ea1a73e28fb92b873ee28102e81811d769b5cd815d2e1d756ece6ea635e5c014
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.InventoryNodeModifyTime_SelfLoop::test f8050cc284f7954c1301091ddc1cbf0fa76073806eee7de4f6cb21063591fbf1
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateNodeFor_SelfLoop::test 14f42e5263c465e8534347c5a3195c195e2d90371dbc2f69d36a40362384505c
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateNodeFor_ComplexSelfLoop::test a2fc7b29b8a7a7767c42ea9c7fb9628451c88991c3eb1ecbd2ce0952ab0b5700
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.RemoveItem::test 1e72f9049b9114f0c56e152d84190d31bca7a862f7ad1459624d753beb6818b4
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.SaveAndRestoreAsync::test bf23b1c67cc9618713d2d8e6653f0ffbbf4c24d7f2c59c5dd639047f7e0c8156
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.GetNodeOrDefault_ReturnsNullWhenMissing::test f5651b5a143470c3ab6ba1f835206a1a55a6218c28242dc12c5d6b5e89519596
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.TryGetValue_Generic::test e6f6d6535af9d011e65cb3c297fe99543f85b64382c47e1756f051d6031886f5
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.RemoveFolderRemovesAllDescendants::test b537223d271b75c11adfa6d87c1e79bb29366f294657ddf71f236fab0dee009f
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.DescendentCountUpdatesOnAddAndRemove::test cfe6571887d0e992ff4d69ccbcdfb34012f9bb5d62118201c33d7d66cc9ddfd8
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.MovingItemUpdatesAncestorDescendentCounts::test 1f4b4189694b9471d48562a434c91a9e455706b83b65bb855c0846388b44c759
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.ConcurrentAddMoveRemoveStress::test 0b76b2fb62a6300e02a02859772f146f107caa77986f4d593e3a4d01966ab4e4
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.ConcurrentLinkAddRemoveStress::test eef3b4eb300427800757dc6cac2dbd9202ed1cf1aac42565b3c26eb11e71bbf1
// pending-parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.LinkIndexUpdateOnAssetChange::test d3e0066e06ab1c48520e5e0bbba8069b74f1a38d37e24d914392406b41b2ea0c
// pending-parity-case: LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibraryFoldersArePopulatedAfterLogin::test dc865c88bb514bb71157a451e938b5ae3e3adde208d267d6a7196706dc9cfda2
// pending-parity-case: LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibraryFolderItemsCanBeFetched::test 475561d29dd25aba52d94f8374fe9083fea2ed7af44dfb6d25b55ce487b080ab
// pending-parity-case: LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibrarySubFolderContainsItems::test a6d02cbcb7fde8248419f1cf7355c3d37f06e8b365dc483fad935dd9a0ac5909
// pending-parity-case: LibreMetaverse.Tests/MarketplaceFolderClassifierTests.cs::MarketplaceFolderClassifierTests.GetRole_ListingsRootFolder_ReturnsListingsRoot::test a3c21e19f21924bffbbafe1199a4b942b545bdb278c3362b2a1ec98b35d672cf
// pending-parity-case: LibreMetaverse.Tests/MarketplaceFolderClassifierTests.cs::MarketplaceFolderClassifierTests.GetRole_ListingFolder_ReturnsListing::test c08d860a4506254d9ac831e91894f2fc34d840c100468ee7e39b505690302368
// pending-parity-case: LibreMetaverse.Tests/MarketplaceFolderClassifierTests.cs::MarketplaceFolderClassifierTests.GetRole_VersionFolder_ReturnsVersion::test 90d792d6858c6a253b9ddf80d3f5e7244570490fa4ef68c1914b342db05c7aa2
@@ -769,10 +733,6 @@
// pending-parity-case: LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.SetRegionRestartScheduleAsync_EmptyDaysClearsSchedule::test 57ef3c0f8d9eeac58a7d1b3e7dbc44413016f39303d304cacd3071bd2c55f320
// pending-parity-case: LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.SetRegionRestartScheduleAsync_NoCapability_ReturnsFalseWithoutRequest::test be03507fe574b9f7c7174c39af44b7b693e1b7a496845db46451ef09bf9db206
// pending-parity-case: LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.SetRegionRestartScheduleAsync_NonSuccessStatus_ReturnsFalse::test 16c8988d7aa15ea9f58deaa2e3f416b6115978e23073fd99749843f4f410dca4
// pending-parity-case: LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_CapAvailable_ReturnsContentsFolderAndDecryptsShadowId::test c9bfc5526260f9e2dffa8a22938999911fdd80be4b2b6d6487bf6171f8dbb56a
// pending-parity-case: LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_PlainAssetId_ParsesWithoutDecryption::test 95f39928dae61bca86b7d0a0702307db6c5fdc754e51f73a24bd5ee131e6de3f
// pending-parity-case: LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_NonSuccessStatus_ReturnsContentsFolderOnly::test b8a25891064e470ac8d77ecd8a4847cf773b043de5ebeae275a9dd6669518585
// pending-parity-case: LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_NoCapability_DoesNotMakeHttpRequest::test c0c43ebcf781fb81b1fef7ce1dd2774e350d92ef882f49876f1a16d23a338592
// pending-parity-case: LibreMetaverse.Tests/SimConsoleTests.cs::SimConsoleTests.SendSimConsoleCommandAsync_IgnoresPostBody_UsesSimConsoleResponseEvent::test df6eb48241f71c34074be66869c9ae1d5980186583259568728261b5eedd7c48
// pending-parity-case: LibreMetaverse.Tests/SimConsoleTests.cs::SimConsoleTests.SendSimConsoleCommandAsync_NoResponseEvent_ReturnsNullAfterTimeout::test 2ac5a6c96f3acec341056387d727288fd3661565bd2a7c385078602efe8661da
// pending-parity-case: LibreMetaverse.Tests/SimConsoleTests.cs::SimConsoleTests.SimConsoleResponseMessage_Deserialize_ReadsBodyField::test 4d367bc3fd012d1579847fd9837bf883c5ea95452776a086bbf856899d7c2099

View File

@@ -0,0 +1,302 @@
// Exact Rust translations of LibreMetaverse.Tests/ConstructorNullArgumentTests.cs and
// LibreMetaverse.Tests/InventoryAISClientTests.cs inventory-owned cases.
// Source SHA-256: 28deea0bf4d9353a2424842c6184abab8fe82746ceb12e093912728a247f21bc
// Source SHA-256: 6de18630ff0da2612721a9d4e28b5fdee5845c8d9477d322a8d608508762e1ff
use libremetaverse::{Error, GridClient, InventoryAISClient};
use libremetaverse_compat_tests::block_on;
use libremetaverse_structured_data::OSD;
use libremetaverse_types::{AssetType, InventoryType, SaleType, UUID};
use std::collections::HashMap;
use std::future::Future;
use std::sync::Arc;
use std::task::{Context, Poll, Waker};
use std::time::{SystemTime, UNIX_EPOCH};
fn uuid() -> UUID {
UUID::random().expect("UUID Random")
}
fn now_seconds() -> i32 {
i32::try_from(
SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("clock before Unix epoch")
.as_secs(),
)
.expect("current Unix time fits the C# Int32 fixture")
}
fn map(entries: impl IntoIterator<Item = (&'static str, OSD)>) -> OSD {
OSD::Map(
entries
.into_iter()
.map(|(key, value)| (key.to_owned(), value))
.collect(),
)
}
fn permissions(creator: UUID, last_owner: UUID, owner: Option<UUID>) -> OSD {
map([
("creator_id", OSD::UUID(creator)),
("last_owner_id", OSD::UUID(last_owner)),
("owner_id", OSD::UUID(owner.unwrap_or(last_owner))),
("base_mask", OSD::Integer(0)),
("everyone_mask", OSD::Integer(0)),
("group_mask", OSD::Integer(0)),
("next_owner_mask", OSD::Integer(0)),
("owner_mask", OSD::Integer(0)),
("is_owner_group", OSD::Boolean(false)),
("group_id", OSD::UUID(UUID::zero())),
])
}
fn sale_info() -> OSD {
map([
("sale_price", OSD::Integer(0)),
("sale_type", OSD::Integer(SaleType::Not as i32)),
])
}
fn concrete_item(item_id: UUID, parent_id: UUID, agent_id: UUID, name: &str) -> OSD {
map([
("item_id", OSD::UUID(item_id)),
("parent_id", OSD::UUID(parent_id)),
("name", OSD::String(name.into())),
("desc", OSD::String("desc".into())),
("agent_id", OSD::UUID(agent_id)),
("inv_type", OSD::Integer(i32::from(InventoryType::OBJECT.0))),
("type", OSD::Integer(AssetType::Object as i32)),
("created_at", OSD::Integer(now_seconds())),
("permissions", permissions(uuid(), uuid(), Some(agent_id))),
("sale_info", sale_info()),
])
}
fn link_item(
item_id: UUID,
parent_id: UUID,
agent_id: UUID,
linked_id: UUID,
name: &str,
asset_type: AssetType,
) -> OSD {
map([
("item_id", OSD::UUID(item_id)),
("parent_id", OSD::UUID(parent_id)),
("name", OSD::String(name.into())),
("desc", OSD::String("desc".into())),
("agent_id", OSD::UUID(agent_id)),
("linked_id", OSD::UUID(linked_id)),
(
"inv_type",
OSD::Integer(i32::from(InventoryType::TEXTURE.0)),
),
("type", OSD::Integer(asset_type as i32)),
("created_at", OSD::Integer(now_seconds())),
("permissions", permissions(uuid(), uuid(), None)),
("sale_info", sale_info()),
])
}
fn section(name: &'static str, value: OSD, embedded: bool) -> OSD {
let content = map([(name, value)]);
if embedded {
map([("_embedded", content)])
} else {
content
}
}
fn numbered(value: OSD) -> OSD {
OSD::Map(HashMap::from([("0".into(), value)]))
}
fn client() -> InventoryAISClient {
let grid = GridClient::new().expect("GridClient constructor");
InventoryAISClient::new(Some(Arc::new(grid))).expect("InventoryAISClient constructor")
}
// parity-case: LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.InventoryAISClient_Null_Throws::test ac92e375efc45c50b37e6c82aea372d605fceb470ce053a025e05ff47a5c7121 translated
#[test]
fn inventory_ais_client_null_throws() {
match InventoryAISClient::new(None) {
Err(error) => assert_eq!(error, Error::ArgumentNull),
Ok(_) => panic!("expected ArgumentNull for client"),
}
}
// parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_ObjectAsset_ResultsInAttachmentInventoryTypeAndParsesFields::test 3ae365ed34f12d036dcd44c94f8568d163cfeec2a58b4975975b77b418770131 translated
#[test]
fn parse_links_object_asset_results_in_attachment_type_and_parses_fields() {
let item_id = uuid();
let parent_id = uuid();
let agent_id = uuid();
let linked_id = uuid();
let response = section(
"links",
numbered(link_item(
item_id,
parent_id,
agent_id,
linked_id,
"TestObject",
AssetType::Object,
)),
true,
);
let result = client()
.parse_links_from_embedded(Some(response))
.expect("ParseLinksFromEmbedded");
assert_eq!(result.len(), 1);
let parsed = &result[0];
assert_eq!(parsed.base.name(), "TestObject");
assert_eq!(parsed.base.parent_uuid(), parent_id);
assert_eq!(parsed.asset_uuid(), linked_id);
assert_eq!(parsed.base.owner_id(), agent_id);
assert_ne!(parsed.creation_date(), UNIX_EPOCH);
}
// parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_ItemsKey_ParsesConcreteItems::test d9e7c64106639071e1ec6ada7346bfa050a31183becaac79efefcd4755fe2855 translated
#[test]
fn parse_items_items_key_parses_concrete_items() {
let item_id = uuid();
let parent_id = uuid();
let agent_id = uuid();
let response = section(
"items",
numbered(concrete_item(item_id, parent_id, agent_id, "ConcreteItem")),
true,
);
let result = client()
.parse_items_from_embedded(Some(response))
.expect("ParseItemsFromEmbedded");
assert_eq!(result.len(), 1);
let parsed = &result[0];
assert_eq!(parsed.base.name(), "ConcreteItem");
assert_eq!(parsed.base.parent_uuid(), parent_id);
assert_eq!(parsed.base.owner_id(), agent_id);
assert_ne!(parsed.creation_date(), UNIX_EPOCH);
}
// parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_MeshAsset_TreatedAsAttachment::test f807110d577c654128dd8d42e618c610c260c4f3367cf2795776564409f876a2 translated
#[test]
fn parse_links_mesh_asset_treated_as_attachment() {
let item_id = uuid();
let parent_id = uuid();
let agent_id = uuid();
let linked_id = uuid();
let response = section(
"links",
numbered(link_item(
item_id,
parent_id,
agent_id,
linked_id,
"MeshLink",
AssetType::Mesh,
)),
false,
);
let result = client()
.parse_links_from_embedded(Some(response))
.expect("ParseLinksFromEmbedded");
assert_eq!(result.len(), 1);
let parsed = &result[0];
assert_eq!(parsed.base.name(), "MeshLink");
assert_eq!(parsed.base.parent_uuid(), parent_id);
assert_eq!(parsed.asset_uuid(), linked_id);
}
// parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_TopLevelItemsKey_WorksWithoutEmbedded::test 9c8f2090d59ff5e75e75381a7283c501cadd56e591991cdead23c504738a0a6d translated
#[test]
fn parse_items_top_level_items_key_works_without_embedded() {
let response = section(
"items",
numbered(concrete_item(uuid(), uuid(), uuid(), "TopLevelItem")),
false,
);
let result = client()
.parse_items_from_embedded(Some(response))
.expect("ParseItemsFromEmbedded");
assert_eq!(result.len(), 1);
assert_eq!(result[0].base.name(), "TopLevelItem");
}
// parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_TopLevelLinksKey_WorksWithoutEmbedded::test 29afd2bd6a554959d6cfa99b632672d56bbb5bcad2ccbaf8caf4773a514f5d79 translated
#[test]
fn parse_links_top_level_links_key_works_without_embedded() {
let response = section(
"links",
numbered(link_item(
uuid(),
uuid(),
uuid(),
uuid(),
"TopLevelLink",
AssetType::Object,
)),
false,
);
let result = client()
.parse_links_from_embedded(Some(response))
.expect("ParseLinksFromEmbedded");
assert_eq!(result.len(), 1);
assert_eq!(result[0].base.name(), "TopLevelLink");
}
// parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseItemsFromEmbedded_NullOrEmpty_ReturnsEmptyList::test 198fb619bbf396a4b1a7b4b85b7fba8808ae127e2575b2b84d21f01a2bdbc445 translated
#[test]
fn parse_items_null_or_empty_returns_empty_list() {
let ais = client();
assert!(
ais.parse_items_from_embedded(None)
.expect("ParseItemsFromEmbedded null")
.is_empty()
);
assert!(
ais.parse_items_from_embedded(Some(OSD::Map(HashMap::new())))
.expect("ParseItemsFromEmbedded empty")
.is_empty()
);
}
// parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseEmbedded_CombinesItemsAndLinks::test f2ebf4638c9aef3c846dc182d97d80c95118799428cf8c2bba86163e33196846 translated
#[test]
fn parse_embedded_combines_items_and_links() {
let item = concrete_item(uuid(), uuid(), uuid(), "I");
let link = link_item(uuid(), uuid(), uuid(), uuid(), "L", AssetType::Object);
let response = map([(
"_embedded",
map([("items", numbered(item)), ("links", numbered(link))]),
)]);
let mut folders = None;
let mut items = None;
let mut links = None;
client()
.parse_embedded(response, &mut folders, &mut items, &mut links)
.expect("ParseEmbedded");
assert_eq!(items.expect("items output").len(), 1);
assert_eq!(links.expect("links output").len(), 1);
assert!(folders.is_some(), "folders output must not be null");
}
// parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.MoveCategoryLinksAsync_AlwaysReturnsFalse::test bebad05897efc0da2f959b4f567faa3ffee950520d13265ecbab1dee978f4886 translated
#[test]
fn move_category_links_always_returns_false() {
let result = block_on(client().move_category_links("outfit".into(), uuid(), None))
.expect("MoveCategoryLinksAsync");
assert!(!result, "AIS v3 has no MoveCategoryLinks equivalent");
}
// parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.MoveCategoryLinksAsync_ReturnsCompletedTask::test f9830b11e6a75c90f8394a5ade56bbd542c140be4c050ba7db6c9ee4d2b7a699 translated
#[test]
fn move_category_links_returns_completed_future() {
let ais = client();
let mut future = std::pin::pin!(ais.move_category_links("outfit".into(), uuid(), None));
let mut context = Context::from_waker(Waker::noop());
assert!(
matches!(future.as_mut().poll(&mut context), Poll::Ready(Ok(false))),
"MoveCategoryLinksAsync should be immediately ready with false"
);
}

View File

@@ -0,0 +1,357 @@
// Exact Rust translations of LibreMetaverse.Tests/InventoryFetchTests.cs and
// LibreMetaverse.Tests/LibraryInventoryTests.cs.
// Source SHA-256: f5876550ab924ad034ade848e562ee70bbb4e004299d928f43c45cadd1a01465
// Source SHA-256: 1d65ebbaf8fd22427371e2a7f1ef76a4f9a70df0bea7fa53f8f5d3fd3044fa53
use libremetaverse::{
GridClient, InventoryFolder, InventoryItem, InventoryObjectClass, InventorySortOrder,
NetworkManager,
};
use libremetaverse_compat_tests::{block_on, live_grid_credentials};
use libremetaverse_types::UUID;
use libremetaverse_types::compat::{CancellationToken, CancellationTokenSource};
use std::sync::Arc;
use std::time::Duration;
struct LiveInventory {
client: GridClient,
}
impl LiveInventory {
fn login() -> Self {
let mut client = GridClient::new().expect("GridClient constructor");
client.settings().timing().login_timeout = 30_000;
let network = client.network();
let (first, last, password, login_url) = live_grid_credentials();
let start = NetworkManager::start_location("Hooper".into(), 179, 18, 32)
.expect("NetworkManager StartLocation");
let mut login = network
.default_login_params(
first,
last,
password,
"Unit Test Framework".into(),
"admin@radegast.life".into(),
)
.expect("NetworkManager DefaultLoginParams");
login.start = start;
login.uri = login_url;
let logged_in = block_on(network.login_with_login_params_cancellation_token(login, None))
.expect("NetworkManager LoginAsync");
assert!(
logged_in,
"client failed to login: {}",
network.login_message()
);
assert!(network.connected(), "client is not connected to the grid");
assert!(
network.current_sim().is_some(),
"CurrentSim is null after successful login"
);
Self { client }
}
fn agent_id(&mut self) -> UUID {
self.client.self_().agent_id()
}
}
impl Drop for LiveInventory {
fn drop(&mut self) {
let _ = self.client.network().logout_with_method();
let _ = self.client.dispose_with_method();
}
}
fn cancellation_after(duration: Duration) -> CancellationToken {
let source = Arc::new(CancellationTokenSource::new());
let token = source.token();
std::thread::spawn(move || {
std::thread::sleep(duration);
source.cancel();
});
token
}
fn folders(entries: &[Box<dyn InventoryObjectClass>]) -> impl Iterator<Item = &InventoryFolder> {
entries
.iter()
.filter_map(|entry| entry.as_any().downcast_ref::<InventoryFolder>())
}
fn items(entries: &[Box<dyn InventoryObjectClass>]) -> impl Iterator<Item = &InventoryItem> {
entries
.iter()
.filter_map(|entry| entry.as_any().downcast_ref::<InventoryItem>())
}
// parity-case: LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventorySkeletonIsPopulatedAfterLogin::test ea1508e3c676639f00bb8a4c4c72d2ee668603bfbff40ee0b93d7f4beb607f75 ignored-live
#[test]
#[cfg_attr(
not(live_grid_credentials),
ignore = "requires GRID_USER, GRID_PASSWORD, and GRID_LOGIN_URL in the environment or workspace .env"
)]
fn inventory_skeleton_is_populated_after_login() {
let mut live = LiveInventory::login();
let agent_id = live.agent_id();
let store = live.client.inventory().store().expect("inventory store");
let root = store.root_folder().expect("inventory root folder");
assert_ne!(root.base.uuid(), UUID::zero());
let children = store
.get_contents_with_inventory_folder(&root)
.expect("inventory root contents");
assert!(!children.is_empty(), "inventory root has no children");
assert_eq!(folders(&children).count(), children.len());
let first = folders(&children).next().expect("inventory sub-folder");
assert_eq!(first.base.owner_id(), agent_id);
}
// parity-case: LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryRootContainsFolders::test 71f41c718060622e1fd653e6b0fc9fe65f3cd68cab3d128f494cdbc90f9d2726 ignored-live
#[test]
#[cfg_attr(
not(live_grid_credentials),
ignore = "requires GRID_USER, GRID_PASSWORD, and GRID_LOGIN_URL in the environment or workspace .env"
)]
fn inventory_root_contains_folders() {
let mut live = LiveInventory::login();
let agent_id = live.agent_id();
let root = live
.client
.inventory()
.store()
.expect("inventory store")
.root_folder()
.expect("inventory root folder");
assert_ne!(root.base.uuid(), UUID::zero());
let contents = block_on(live.client.inventory().folder_contents(
root.base.uuid(),
agent_id,
true,
true,
InventorySortOrder::BY_NAME,
Some(cancellation_after(Duration::from_secs(30))),
None,
))
.expect("FolderContentsAsync");
if contents.is_empty() {
eprintln!("inventory root fetch returned no results; transient server issue");
return;
}
assert!(folders(&contents).next().is_some());
}
// parity-case: LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryFolderContainsItems::test f0d77649b82d4d7d7778acebd851dd4eb44b76eb687af07bccdd20a1efe96223 ignored-live
#[test]
#[cfg_attr(
not(live_grid_credentials),
ignore = "requires GRID_USER, GRID_PASSWORD, and GRID_LOGIN_URL in the environment or workspace .env"
)]
fn inventory_folder_contains_items() {
let mut live = LiveInventory::login();
let agent_id = live.agent_id();
let store = live.client.inventory().store().expect("inventory store");
let root = store.root_folder().expect("inventory root folder");
assert_ne!(root.base.uuid(), UUID::zero());
let skeleton = store
.get_contents_with_inventory_folder(&root)
.expect("inventory skeleton");
let subfolders: Vec<_> = folders(&skeleton).collect();
assert!(!subfolders.is_empty(), "no inventory sub-folders");
let token = cancellation_after(Duration::from_secs(30));
let mut found = None;
for folder in subfolders {
if token.is_cancellation_requested() {
break;
}
let Ok(contents) = block_on(live.client.inventory().folder_contents(
folder.base.uuid(),
agent_id,
true,
true,
InventorySortOrder::BY_NAME,
Some(token.clone()),
None,
)) else {
continue;
};
let found_items: Vec<_> = items(&contents).collect();
if let Some(first) = found_items.first() {
found = Some((
folder.base.name(),
found_items.len(),
first.base.name(),
first.asset_type(),
));
break;
}
}
let Some((folder_name, count, first_name, first_type)) = found else {
eprintln!("no items found in any inventory sub-folder");
return;
};
assert!(count > 0, "folder {folder_name} has no items");
eprintln!("found {count} items in {folder_name}; first: {first_name} ({first_type:?})");
}
// parity-case: LibreMetaverse.Tests/InventoryFetchTests.cs::InventoryFetchTests.InventoryItemCanBeFetchedById::test 7fe89086754a673ab69814202b48aab9add30dd63ee98a953bdedd54d6788af2 ignored-live
#[test]
#[cfg_attr(
not(live_grid_credentials),
ignore = "requires GRID_USER, GRID_PASSWORD, and GRID_LOGIN_URL in the environment or workspace .env"
)]
fn inventory_item_can_be_fetched_by_id() {
let mut live = LiveInventory::login();
let agent_id = live.agent_id();
let store = live.client.inventory().store().expect("inventory store");
let root = store.root_folder().expect("inventory root folder");
let skeleton = store
.get_contents_with_inventory_folder(&root)
.expect("inventory skeleton");
let subfolders: Vec<_> = folders(&skeleton).collect();
assert!(!subfolders.is_empty(), "no inventory sub-folders");
let token = cancellation_after(Duration::from_secs(30));
let mut target = None;
for folder in subfolders {
if token.is_cancellation_requested() {
break;
}
let Ok(contents) = block_on(live.client.inventory().folder_contents(
folder.base.uuid(),
agent_id,
true,
true,
InventorySortOrder::BY_NAME,
Some(token.clone()),
None,
)) else {
continue;
};
if let Some(item) = items(&contents).next() {
target = Some((item.base.uuid(), item.base.name()));
break;
}
}
let Some((target_id, target_name)) = target else {
eprintln!("no inventory item found to fetch by UUID");
return;
};
let fetched = block_on(live.client.inventory().fetch_item_http(
target_id,
agent_id,
Some(token),
))
.expect("FetchItemHttpAsync")
.expect("fetched inventory item");
assert_eq!(fetched.base.uuid(), target_id);
assert_eq!(fetched.base.name(), target_name);
}
// parity-case: LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibraryFoldersArePopulatedAfterLogin::test dc865c88bb514bb71157a451e938b5ae3e3adde208d267d6a7196706dc9cfda2 ignored-live
#[test]
#[cfg_attr(
not(live_grid_credentials),
ignore = "requires GRID_USER, GRID_PASSWORD, and GRID_LOGIN_URL in the environment or workspace .env"
)]
fn library_folders_are_populated_after_login() {
let live = LiveInventory::login();
let store = live.client.inventory().store().expect("inventory store");
let root = store.library_folder().expect("library root folder");
assert_ne!(root.base.uuid(), UUID::zero());
let children = store
.get_contents_with_inventory_folder(&root)
.expect("library root contents");
assert!(!children.is_empty(), "library root has no children");
assert_eq!(folders(&children).count(), children.len());
assert_ne!(
folders(&children)
.next()
.expect("library sub-folder")
.base
.owner_id(),
UUID::zero()
);
}
// parity-case: LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibraryFolderItemsCanBeFetched::test 475561d29dd25aba52d94f8374fe9083fea2ed7af44dfb6d25b55ce487b080ab ignored-live
#[test]
#[cfg_attr(
not(live_grid_credentials),
ignore = "requires GRID_USER, GRID_PASSWORD, and GRID_LOGIN_URL in the environment or workspace .env"
)]
fn library_folder_items_can_be_fetched() {
let live = LiveInventory::login();
let store = live.client.inventory().store().expect("inventory store");
let root = store.library_folder().expect("library root folder");
let skeleton = store
.get_contents_with_inventory_folder(&root)
.expect("library skeleton");
let owner = folders(&skeleton)
.map(|folder| folder.base.owner_id())
.find(|owner| *owner != UUID::zero())
.expect("library owner UUID");
let contents = block_on(live.client.inventory().folder_contents(
root.base.uuid(),
owner,
true,
true,
InventorySortOrder::BY_NAME,
Some(cancellation_after(Duration::from_secs(30))),
None,
))
.expect("FolderContentsAsync");
if contents.is_empty() {
eprintln!("library root fetch returned no results; transient server issue");
return;
}
assert!(folders(&contents).next().is_some());
}
// parity-case: LibreMetaverse.Tests/LibraryInventoryTests.cs::LibraryInventoryTests.LibrarySubFolderContainsItems::test a6d02cbcb7fde8248419f1cf7355c3d37f06e8b365dc483fad935dd9a0ac5909 ignored-live
#[test]
#[cfg_attr(
not(live_grid_credentials),
ignore = "requires GRID_USER, GRID_PASSWORD, and GRID_LOGIN_URL in the environment or workspace .env"
)]
fn library_sub_folder_contains_items() {
let live = LiveInventory::login();
let store = live.client.inventory().store().expect("inventory store");
let root = store.library_folder().expect("library root folder");
let skeleton = store
.get_contents_with_inventory_folder(&root)
.expect("library skeleton");
let subfolders: Vec<_> = folders(&skeleton).collect();
assert!(!subfolders.is_empty(), "no library sub-folders");
let owner = subfolders
.iter()
.map(|folder| folder.base.owner_id())
.find(|owner| *owner != UUID::zero())
.expect("library owner UUID");
let token = cancellation_after(Duration::from_secs(30));
let mut found = None;
for folder in subfolders {
if token.is_cancellation_requested() {
break;
}
let Ok(contents) = block_on(live.client.inventory().folder_contents(
folder.base.uuid(),
owner,
true,
true,
InventorySortOrder::BY_NAME,
Some(token.clone()),
None,
)) else {
continue;
};
let count = items(&contents).count();
if count > 0 {
found = Some((folder.base.name(), count));
break;
}
}
let Some((folder_name, count)) = found else {
eprintln!("no items found in any library sub-folder");
return;
};
assert!(count > 0, "folder {folder_name} has no items");
}

View File

@@ -0,0 +1,75 @@
// Exact Rust translations of LibreMetaverse.Tests/ConstructorNullArgumentTests.cs and
// LibreMetaverse.Tests/InventoryManagerTests.cs inventory-owned cases.
// Source SHA-256: 28deea0bf4d9353a2424842c6184abab8fe82746ceb12e093912728a247f21bc
// Source SHA-256: 9fd33d6a4e9f3aa2d414439203eecda605ede3eb6e848533ef0778b023407c3d
use libremetaverse::{
Error, InventoryItem, InventoryManager, InventoryNotecard, InventoryTexture, Permissions,
};
use libremetaverse_types::{AssetType, InventoryType, SaleType, UUID};
use std::time::SystemTime;
fn uuid() -> UUID {
UUID::random().expect("UUID Random")
}
// parity-case: LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.InventoryManager_Null_Throws::test 5e7498066c944800354abbc71eea825fe90d0c40a25a6065967a3ebcc9efea74 translated
#[test]
fn inventory_manager_null_throws() {
match InventoryManager::new(None) {
Err(error) => assert_eq!(error, Error::ArgumentNull),
Ok(_) => panic!("expected ArgumentNull for client"),
}
}
// parity-case: LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.EncryptDecrypt_RoundTrip::test 7b59c330ffacf1174dd884f369a4e4015e1a212a0e43d7fa8889f7505dd5599d translated
#[test]
fn encrypt_decrypt_round_trip() {
let asset_id = uuid();
let shadow = InventoryManager::encrypt_asset_id(asset_id).expect("EncryptAssetID");
let decrypted = InventoryManager::decrypt_shadow_id(shadow).expect("DecryptShadowID");
assert_eq!(decrypted, asset_id);
}
// parity-case: LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.ItemCRC_IsDeterministic_AndChangesWhenFieldsChange::test dbd322778ad7f110abce5f10a0c83ad002ae76f6a114fa795fb90a799f4ff077 translated
#[test]
fn item_crc_is_deterministic_and_changes_when_fields_change() {
let mut item = InventoryItem::new_with_uuid(uuid()).expect("InventoryItem constructor");
item.set_asset_uuid(uuid());
item.base.set_parent_uuid(uuid());
item.set_creator_id(uuid());
item.base.set_owner_id(uuid());
item.set_group_id(uuid());
item.set_flags(0x1234_5678);
item.set_inventory_type(InventoryType::OBJECT);
item.set_asset_type(AssetType::Object);
item.set_creation_date(SystemTime::now());
item.set_sale_price(42);
item.set_sale_type(SaleType::Not);
item.set_permissions(Permissions::full_permissions());
let crc1 = InventoryManager::item_crc(&item).expect("ItemCRC first");
let crc2 = InventoryManager::item_crc(&item).expect("ItemCRC second");
assert_eq!(crc2, crc1, "ItemCRC must be deterministic");
item.set_asset_uuid(uuid());
let crc3 = InventoryManager::item_crc(&item).expect("ItemCRC changed");
assert_ne!(crc3, crc1, "ItemCRC must include AssetUUID");
}
// parity-case: LibreMetaverse.Tests/InventoryManagerTests.cs::InventoryManagerTests.CreateInventoryItem_ReturnsCorrectSubclass::test 219f8c91bc1b3d5b5d3e5b2f2880c5733fd02e6103ccc9c6ecbf8d03328274f6 translated
#[test]
fn create_inventory_item_returns_correct_subclass() {
let id = uuid();
let texture = InventoryManager::create_inventory_item(InventoryType::TEXTURE, id)
.expect("CreateInventoryItem texture");
let notecard = InventoryManager::create_inventory_item(InventoryType::NOTECARD, id)
.expect("CreateInventoryItem notecard");
// C# explicitly casts 999 to the signed-byte-backed InventoryType, yielding -25.
let unknown = InventoryManager::create_inventory_item(InventoryType(-25), id)
.expect("CreateInventoryItem unknown");
assert!(texture.as_any().is::<InventoryTexture>());
assert!(notecard.as_any().is::<InventoryNotecard>());
assert!(unknown.as_any().is::<InventoryItem>());
}

View File

@@ -0,0 +1,545 @@
// Exact Rust translations of LibreMetaverse.Tests/InventoryTests.cs.
// Source SHA-256: 378ab668bdea082d90fb0105e2bcd6b7734d7fe9eb9c1bf550554bd4ef700953
use libremetaverse::{GridClient, Inventory, InventoryFolder, InventoryItem, InventoryNode};
use libremetaverse_compat_tests::block_on;
use libremetaverse_types::{AssetType, UUID};
use std::path::{Path, PathBuf};
use std::sync::{Arc, Mutex};
fn uuid() -> UUID {
UUID::random().expect("UUID Random")
}
struct Fixture {
client: Arc<GridClient>,
inventory: Inventory,
}
impl Fixture {
fn new() -> Self {
let client = Arc::new(GridClient::new().expect("GridClient constructor"));
let inventory = Inventory::new_with_grid_client_uuid(Arc::clone(&client), uuid())
.expect("Inventory constructor");
Self { client, inventory }
}
}
impl Drop for Fixture {
fn drop(&mut self) {
let _ = self.client.dispose_with_method();
}
}
fn folder(name: &str, parent: UUID) -> InventoryFolder {
let mut folder = InventoryFolder::new(uuid()).expect("InventoryFolder constructor");
folder.base.set_name(name.into());
folder.base.set_parent_uuid(parent);
folder
}
fn item(name: &str, parent: UUID) -> InventoryItem {
let mut item = InventoryItem::new_with_uuid(uuid()).expect("InventoryItem constructor");
item.base.set_name(name.into());
item.base.set_parent_uuid(parent);
item
}
struct TempDirectory(PathBuf);
impl TempDirectory {
fn new() -> Self {
let path = std::env::temp_dir().join(format!("metacrate-inventory-{}", uuid().to_string()));
std::fs::create_dir(&path).expect("create isolated temporary directory");
Self(path)
}
fn file(&self, name: &str) -> PathBuf {
self.0.join(name)
}
}
impl Drop for TempDirectory {
fn drop(&mut self) {
let _ = std::fs::remove_dir_all(&self.0);
}
}
fn path_string(path: &Path) -> String {
path.to_string_lossy().into_owned()
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.AddAndGetItem::test 24702f0cf9215beee29123ee81dab4a7fe971beb197ecceac9a1761b695bce45 translated
#[test]
fn add_and_get_item() {
let fixture = Fixture::new();
let folder = folder("TestFolder", UUID::zero());
let folder_id = folder.base.uuid();
fixture.inventory.update_node_for(&folder).unwrap();
let item = item("Item1", folder_id);
let item_id = item.base.uuid();
fixture.inventory.update_node_for(&item).unwrap();
assert!(fixture.inventory.contains_with_uuid(item_id).unwrap());
let mut found = None;
assert!(
fixture
.inventory
.try_get_value_with_uuid_inventory_base(item_id, &mut found)
.unwrap()
);
let found = found.expect("inventory item");
assert!(found.as_any().is::<InventoryItem>());
assert_eq!(found.inventory_base().name(), "Item1");
let contents = fixture
.inventory
.get_contents_with_inventory_folder(&folder)
.unwrap();
assert_eq!(contents.len(), 1);
assert_eq!(contents[0].inventory_base().uuid(), item_id);
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateItemParent::test ea1a73e28fb92b873ee28102e81811d769b5cd815d2e1d756ece6ea635e5c014 translated
#[test]
fn update_item_parent() {
let fixture = Fixture::new();
let folder1 = folder("F1", UUID::zero());
let folder2 = folder("F2", UUID::zero());
let folder1_id = folder1.base.uuid();
let folder2_id = folder2.base.uuid();
fixture.inventory.update_node_for(&folder1).unwrap();
fixture.inventory.update_node_for(&folder2).unwrap();
let mut item = item("Item", folder1_id);
let item_id = item.base.uuid();
fixture.inventory.update_node_for(&item).unwrap();
assert_eq!(item.base.parent_uuid(), folder1_id);
item.base.set_parent_uuid(folder2_id);
fixture.inventory.update_node_for(&item).unwrap();
let contents1 = fixture
.inventory
.get_contents_with_inventory_folder(&folder1)
.unwrap();
let contents2 = fixture
.inventory
.get_contents_with_inventory_folder(&folder2)
.unwrap();
assert!(
contents1
.iter()
.all(|entry| entry.inventory_base().uuid() != item_id)
);
assert!(
contents2
.iter()
.any(|entry| entry.inventory_base().uuid() == item_id)
);
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.InventoryNodeModifyTime_SelfLoop::test f8050cc284f7954c1301091ddc1cbf0fa76073806eee7de4f6cb21063591fbf1 translated
#[test]
fn inventory_node_modify_time_self_loop() {
let folder_id = uuid();
let mut folder = InventoryFolder::new(folder_id).unwrap();
folder.base.set_name("F1".into());
folder.base.set_parent_uuid(folder_id);
let node = InventoryNode::new_with_inventory_base(&folder).unwrap();
assert_eq!(node.modify_time(), std::time::SystemTime::UNIX_EPOCH);
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateNodeFor_SelfLoop::test 14f42e5263c465e8534347c5a3195c195e2d90371dbc2f69d36a40362384505c translated
#[test]
fn update_node_for_self_loop() {
let fixture = Fixture::new();
let folder_id = uuid();
let mut folder = InventoryFolder::new(folder_id).unwrap();
folder.base.set_name("F1".into());
folder.base.set_parent_uuid(folder_id);
fixture.inventory.update_node_for(&folder).unwrap();
assert!(fixture.inventory.contains_with_uuid(folder_id).unwrap());
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.UpdateNodeFor_ComplexSelfLoop::test a2fc7b29b8a7a7767c42ea9c7fb9628451c88991c3eb1ecbd2ce0952ab0b5700 translated
#[test]
fn update_node_for_complex_self_loop() {
let fixture = Fixture::new();
let folder1_id = uuid();
let folder2_id = uuid();
let mut folder1 = InventoryFolder::new(folder1_id).unwrap();
folder1.base.set_name("F1".into());
folder1.base.set_parent_uuid(folder2_id);
let mut folder2 = InventoryFolder::new(folder2_id).unwrap();
folder2.base.set_name("F2".into());
folder2.base.set_parent_uuid(folder1_id);
fixture.inventory.update_node_for(&folder1).unwrap();
assert!(fixture.inventory.contains_with_uuid(folder1_id).unwrap());
assert!(fixture.inventory.contains_with_uuid(folder2_id).unwrap());
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.RemoveItem::test 1e72f9049b9114f0c56e152d84190d31bca7a862f7ad1459624d753beb6818b4 translated
#[test]
fn remove_item() {
let fixture = Fixture::new();
let folder = folder("Folder", UUID::zero());
let folder_id = folder.base.uuid();
fixture.inventory.update_node_for(&folder).unwrap();
let item = item("ToRemove", folder_id);
let item_id = item.base.uuid();
fixture.inventory.update_node_for(&item).unwrap();
assert!(fixture.inventory.contains_with_uuid(item_id).unwrap());
fixture.inventory.remove_node_for(&item).unwrap();
assert!(!fixture.inventory.contains_with_uuid(item_id).unwrap());
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.SaveAndRestoreAsync::test bf23b1c67cc9618713d2d8e6653f0ffbbf4c24d7f2c59c5dd639047f7e0c8156 translated
#[test]
fn save_and_restore_async() {
let fixture = Fixture::new();
let folder = folder("FolderSave", UUID::zero());
let folder_id = folder.base.uuid();
fixture.inventory.update_node_for(&folder).unwrap();
let item = item("SaveItem", folder_id);
let item_id = item.base.uuid();
fixture.inventory.update_node_for(&item).unwrap();
let temporary = TempDirectory::new();
let file = path_string(&temporary.file("inventory.bin"));
block_on(
fixture
.inventory
.save_to_disk_with_string_cancellation_token(file.clone(), None),
)
.unwrap();
fixture.inventory.clear().unwrap();
assert!(!fixture.inventory.contains_with_uuid(item_id).unwrap());
let count = block_on(
fixture
.inventory
.restore_from_disk_with_string_cancellation_token(file, None),
)
.unwrap();
assert!(count >= 0);
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.GetNodeOrDefault_ReturnsNullWhenMissing::test f5651b5a143470c3ab6ba1f835206a1a55a6218c28242dc12c5d6b5e89519596 translated
#[test]
fn get_node_or_default_returns_null_when_missing() {
assert!(
Fixture::new()
.inventory
.get_node_or_default(uuid())
.unwrap()
.is_none()
);
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.TryGetValue_Generic::test e6f6d6535af9d011e65cb3c297fe99543f85b64382c47e1756f051d6031886f5 translated
#[test]
fn try_get_value_generic() {
let fixture = Fixture::new();
let folder = folder("GenFolder", UUID::zero());
let folder_id = folder.base.uuid();
fixture.inventory.update_node_for(&folder).unwrap();
let item = item("GenItem", folder_id);
let item_id = item.base.uuid();
fixture.inventory.update_node_for(&item).unwrap();
let mut found = None;
assert!(
fixture
.inventory
.try_get_value_with_uuid_t::<InventoryItem>(item_id, &mut found)
);
let found = found.expect("generic inventory item");
assert_eq!(found.base.uuid(), item_id);
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.RemoveFolderRemovesAllDescendants::test b537223d271b75c11adfa6d87c1e79bb29366f294657ddf71f236fab0dee009f translated
#[test]
fn remove_folder_removes_all_descendants() {
let fixture = Fixture::new();
let parent = folder("Parent", UUID::zero());
let parent_id = parent.base.uuid();
let child = folder("ChildFolder", parent_id);
let child_id = child.base.uuid();
let item = item("NestedItem", child_id);
let item_id = item.base.uuid();
fixture.inventory.update_node_for(&parent).unwrap();
fixture.inventory.update_node_for(&child).unwrap();
fixture.inventory.update_node_for(&item).unwrap();
assert!(fixture.inventory.contains_with_uuid(parent_id).unwrap());
assert!(fixture.inventory.contains_with_uuid(child_id).unwrap());
assert!(fixture.inventory.contains_with_uuid(item_id).unwrap());
fixture.inventory.remove_node_for(&parent).unwrap();
assert!(!fixture.inventory.contains_with_uuid(parent_id).unwrap());
assert!(!fixture.inventory.contains_with_uuid(child_id).unwrap());
assert!(!fixture.inventory.contains_with_uuid(item_id).unwrap());
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.DescendentCountUpdatesOnAddAndRemove::test cfe6571887d0e992ff4d69ccbcdfb34012f9bb5d62118201c33d7d66cc9ddfd8 translated
#[test]
fn descendent_count_updates_on_add_and_remove() {
let fixture = Fixture::new();
let folder = folder("Folder", UUID::zero());
let folder_id = folder.base.uuid();
fixture.inventory.update_node_for(&folder).unwrap();
let node = fixture.inventory.get_node_for(folder_id).unwrap();
let data = node.data().expect("folder node data");
let folder_data = data
.as_any()
.downcast_ref::<InventoryFolder>()
.expect("InventoryFolder data");
assert_eq!(folder_data.descendent_count(), 0);
let item = item("Item", folder_id);
fixture.inventory.update_node_for(&item).unwrap();
let node = fixture.inventory.get_node_for(folder_id).unwrap();
let data = node.data().expect("folder node data after add");
let folder_data = data.as_any().downcast_ref::<InventoryFolder>().unwrap();
assert!(folder_data.descendent_count() > 0);
fixture.inventory.remove_node_for(&item).unwrap();
let node = fixture.inventory.get_node_for(folder_id).unwrap();
let data = node.data().expect("folder node data after remove");
let folder_data = data.as_any().downcast_ref::<InventoryFolder>().unwrap();
assert_eq!(folder_data.descendent_count(), 0);
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.MovingItemUpdatesAncestorDescendentCounts::test 1f4b4189694b9471d48562a434c91a9e455706b83b65bb855c0846388b44c759 translated
#[test]
fn moving_item_updates_ancestor_descendent_counts() {
let fixture = Fixture::new();
let folder1 = folder("F1", UUID::zero());
let folder2 = folder("F2", UUID::zero());
let folder1_id = folder1.base.uuid();
let folder2_id = folder2.base.uuid();
fixture.inventory.update_node_for(&folder1).unwrap();
fixture.inventory.update_node_for(&folder2).unwrap();
let mut item = item("Movable", folder1_id);
fixture.inventory.update_node_for(&item).unwrap();
let first = fixture.inventory.get_node_for(folder1_id).unwrap();
let first_data = first.data().unwrap();
let first_folder = first_data
.as_any()
.downcast_ref::<InventoryFolder>()
.unwrap();
let second = fixture.inventory.get_node_for(folder2_id).unwrap();
let second_data = second.data().unwrap();
let second_folder = second_data
.as_any()
.downcast_ref::<InventoryFolder>()
.unwrap();
assert!(first_folder.descendent_count() > 0);
assert_eq!(second_folder.descendent_count(), 0);
item.base.set_parent_uuid(folder2_id);
fixture.inventory.update_node_for(&item).unwrap();
let first = fixture.inventory.get_node_for(folder1_id).unwrap();
let first_data = first.data().unwrap();
let first_folder = first_data
.as_any()
.downcast_ref::<InventoryFolder>()
.unwrap();
let second = fixture.inventory.get_node_for(folder2_id).unwrap();
let second_data = second.data().unwrap();
let second_folder = second_data
.as_any()
.downcast_ref::<InventoryFolder>()
.unwrap();
assert_eq!(first_folder.descendent_count(), 0);
assert!(second_folder.descendent_count() > 0);
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.ConcurrentAddMoveRemoveStress::test 0b76b2fb62a6300e02a02859772f146f107caa77986f4d593e3a4d01966ab4e4 translated
#[test]
fn concurrent_add_move_remove_stress() {
const ITEM_COUNT: usize = 500;
let fixture = Fixture::new();
let folder1 = folder("Folder1", UUID::zero());
let folder2 = folder("Folder2", UUID::zero());
let folder3 = folder("Folder3", UUID::zero());
let folder1_id = folder1.base.uuid();
let folder2_id = folder2.base.uuid();
let folder3_id = folder3.base.uuid();
fixture.inventory.update_node_for(&folder1).unwrap();
fixture.inventory.update_node_for(&folder2).unwrap();
fixture.inventory.update_node_for(&folder3).unwrap();
let items: Vec<_> = (0..ITEM_COUNT)
.map(|index| Arc::new(Mutex::new(item(&format!("Item{index}"), folder1_id))))
.collect();
std::thread::scope(|scope| {
for item in &items {
let item = Arc::clone(item);
let inventory = &fixture.inventory;
scope.spawn(move || inventory.update_node_for(&*item.lock().unwrap()).unwrap());
}
});
for item in &items {
assert!(
fixture
.inventory
.contains_with_uuid(item.lock().unwrap().base.uuid())
.unwrap()
);
}
std::thread::scope(|scope| {
for (index, item) in items.iter().enumerate() {
let item = Arc::clone(item);
let inventory = &fixture.inventory;
scope.spawn(move || {
let mut item = item.lock().unwrap();
item.base.set_parent_uuid(if index % 2 == 0 {
folder2_id
} else {
folder3_id
});
inventory.update_node_for(&*item).unwrap();
});
}
});
let count = |folder_id| {
let node = fixture.inventory.get_node_for(folder_id).unwrap();
let data = node.data().unwrap();
data.as_any()
.downcast_ref::<InventoryFolder>()
.unwrap()
.descendent_count()
};
assert_eq!(count(folder1_id), 0);
assert_eq!(
count(folder2_id) + count(folder3_id),
i32::try_from(ITEM_COUNT).unwrap()
);
std::thread::scope(|scope| {
for item in &items {
let item = Arc::clone(item);
let inventory = &fixture.inventory;
scope.spawn(move || inventory.remove_node_for(&*item.lock().unwrap()).unwrap());
}
});
for item in &items {
assert!(
!fixture
.inventory
.contains_with_uuid(item.lock().unwrap().base.uuid())
.unwrap()
);
}
assert_eq!(count(folder1_id), 0);
assert_eq!(count(folder2_id), 0);
assert_eq!(count(folder3_id), 0);
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.ConcurrentLinkAddRemoveStress::test eef3b4eb300427800757dc6cac2dbd9202ed1cf1aac42565b3c26eb11e71bbf1 translated
#[test]
fn concurrent_link_add_remove_stress() {
const ITEM_COUNT: usize = 200;
let fixture = Fixture::new();
let folder1 = folder("LinkFolder", UUID::zero());
let folder2 = folder("LinkFolder2", UUID::zero());
let folder1_id = folder1.base.uuid();
let folder2_id = folder2.base.uuid();
fixture.inventory.update_node_for(&folder1).unwrap();
fixture.inventory.update_node_for(&folder2).unwrap();
let asset_id = uuid();
let items: Vec<_> = (0..ITEM_COUNT)
.map(|index| {
let mut item = item(&format!("L{index}"), folder1_id);
item.set_asset_type(AssetType::Link);
item.set_asset_uuid(asset_id);
Arc::new(Mutex::new(item))
})
.collect();
std::thread::scope(|scope| {
for item in &items {
let item = Arc::clone(item);
let inventory = &fixture.inventory;
scope.spawn(move || inventory.update_node_for(&*item.lock().unwrap()).unwrap());
}
});
assert_eq!(
fixture.inventory.find_all_links(asset_id).unwrap().len(),
ITEM_COUNT
);
std::thread::scope(|scope| {
for (index, item) in items.iter().enumerate() {
let item = Arc::clone(item);
let inventory = &fixture.inventory;
scope.spawn(move || {
let mut item = item.lock().unwrap();
item.base.set_parent_uuid(if index % 2 == 0 {
folder2_id
} else {
folder1_id
});
inventory.update_node_for(&*item).unwrap();
});
}
});
assert_eq!(
fixture.inventory.find_all_links(asset_id).unwrap().len(),
ITEM_COUNT
);
std::thread::scope(|scope| {
for item in &items {
let item = Arc::clone(item);
let inventory = &fixture.inventory;
scope.spawn(move || inventory.remove_node_for(&*item.lock().unwrap()).unwrap());
}
});
assert!(
fixture
.inventory
.find_all_links(asset_id)
.unwrap()
.is_empty()
);
for item in &items {
assert!(
!fixture
.inventory
.contains_with_uuid(item.lock().unwrap().base.uuid())
.unwrap()
);
}
}
// parity-case: LibreMetaverse.Tests/InventoryTests.cs::InventoryTests.LinkIndexUpdateOnAssetChange::test d3e0066e06ab1c48520e5e0bbba8069b74f1a38d37e24d914392406b41b2ea0c translated
#[test]
fn link_index_updates_on_asset_change() {
let fixture = Fixture::new();
let folder = folder("LUpdate", UUID::zero());
let folder_id = folder.base.uuid();
fixture.inventory.update_node_for(&folder).unwrap();
let asset1 = uuid();
let asset2 = uuid();
let mut item = item("LinkItem", folder_id);
let item_id = item.base.uuid();
item.set_asset_type(AssetType::Link);
item.set_asset_uuid(asset1);
fixture.inventory.update_node_for(&item).unwrap();
let found1 = fixture.inventory.find_all_links(asset1).unwrap();
assert_eq!(found1.len(), 1);
let data = found1[0].data().expect("link node data");
assert_eq!(data.inventory_base().uuid(), item_id);
item.set_asset_uuid(asset2);
fixture.inventory.update_node_for(&item).unwrap();
let found1 = fixture.inventory.find_all_links(asset1).unwrap();
let found2 = fixture.inventory.find_all_links(asset2).unwrap();
assert!(found1.is_empty());
assert_eq!(found2.len(), 1);
let data = found2[0].data().expect("updated link node data");
assert_eq!(data.inventory_base().uuid(), item_id);
}

View File

@@ -6,10 +6,14 @@ use libremetaverse::{
InventoryWearable,
};
use libremetaverse_types::{AssetType, AttachmentPoint, UUID, WearableType};
use std::sync::Arc;
fn store() -> Inventory {
Inventory::new_with_grid_client_uuid(GridClient::new().unwrap(), UUID::random().unwrap())
.unwrap()
Inventory::new_with_grid_client_uuid(
Arc::new(GridClient::new().unwrap()),
UUID::random().unwrap(),
)
.unwrap()
}
fn texture_link(target: UUID) -> InventoryTexture {
@@ -52,7 +56,7 @@ fn inventory_store_contains_finds_target_by_resolved_item_id() {
target.set_wearable_type(WearableType::Shirt);
target.base.set_asset_type(AssetType::Clothing);
target.base.set_asset_uuid(UUID::random().unwrap());
store.update_node_for(target.base.base).unwrap();
store.update_node_for(&target).unwrap();
let link = texture_link(target_id);
assert!(
store
@@ -71,7 +75,7 @@ fn inventory_store_indexer_returns_wearable_when_target_is_wearable() {
target.base.set_asset_type(AssetType::Clothing);
target.base.set_asset_uuid(UUID::random().unwrap());
target.base.base.set_name("Test Shirt".into());
store.update_node_for(target.base.base).unwrap();
store.update_node_for(&target).unwrap();
let link = texture_link(target_id);
let resolved = store
.get_value_or_default_with_uuid_a7c63fbe::<InventoryWearable>(link.base.resolved_item_id())
@@ -93,7 +97,7 @@ fn inventory_store_indexer_returns_attachment_when_target_is_attachment() {
target.base.set_asset_type(AssetType::Object);
target.base.set_asset_uuid(UUID::random().unwrap());
target.base.base.set_name("Test Attachment".into());
store.update_node_for(target.base.base).unwrap();
store.update_node_for(&target).unwrap();
let link = texture_link(target_id);
let resolved = store
.get_value_or_default_with_uuid_a7c63fbe::<InventoryAttachment>(
@@ -117,7 +121,7 @@ fn inventory_store_indexer_returns_object_when_target_is_object() {
target.base.set_asset_type(AssetType::Object);
target.base.set_asset_uuid(UUID::random().unwrap());
target.base.base.set_name("Test Object".into());
store.update_node_for(target.base.base).unwrap();
store.update_node_for(&target).unwrap();
let link = texture_link(target_id);
let resolved = store
.get_value_or_default_with_uuid_a7c63fbe::<InventoryObject>(link.base.resolved_item_id())

View File

@@ -0,0 +1,224 @@
// Exact Rust translations of LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs.
// Source SHA-256: f444adc7615a805eddeef538ce939375dc2a2fa2cd871aab2ebce37b4e955941
use libremetaverse::{
GridClient, HttpCapsClient, InventoryFolder, InventoryItem, InventoryManager,
InventoryObjectClass, Simulator,
};
use libremetaverse_compat_tests::block_on;
use libremetaverse_types::UUID;
use libremetaverse_types::compat::{
CancellationToken, CancellationTokenSource, HttpMessageHandler, HttpRequest, HttpResponse, Uri,
};
use std::collections::BTreeMap;
use std::sync::{Arc, Mutex};
use std::time::Duration;
const CAP: &str = "http://test.invalid/request-task-inventory";
const SEED: &str = "http://test.invalid/seed";
#[derive(Clone)]
struct Recording(Arc<Mutex<Vec<HttpRequest>>>);
impl Recording {
fn requests(&self) -> Vec<HttpRequest> {
self.0.lock().unwrap().clone()
}
}
fn client_with_cap(response: HttpResponse, expose_capability: bool) -> (GridClient, Recording) {
let requests = Arc::new(Mutex::new(Vec::new()));
let recorded = Arc::clone(&requests);
let response = Mutex::new(Some(response));
let seed = if expose_capability {
format!("<llsd><map><key>RequestTaskInventory</key><uri>{CAP}</uri></map></llsd>")
} else {
"<llsd><map></map></llsd>".into()
};
let handler = HttpMessageHandler::new(move |request, _| {
let result = if request.uri.0 == SEED {
HttpResponse {
status_code: 200,
headers: BTreeMap::new(),
content_type: Some("application/llsd+xml".into()),
body: seed.as_bytes().to_vec(),
}
} else {
recorded.lock().unwrap().push(request);
response.lock().unwrap().take().unwrap_or(HttpResponse {
status_code: 404,
headers: BTreeMap::new(),
content_type: None,
body: Vec::new(),
})
};
async move { result }
});
let mut client = GridClient::new().expect("GridClient constructor");
client.set_http_caps_client(HttpCapsClient::new(handler.clone()).unwrap());
let mut simulator_client = GridClient::new().expect("simulator GridClient constructor");
simulator_client.set_http_caps_client(HttpCapsClient::new(handler).unwrap());
let simulator = Simulator::new(
simulator_client,
"127.0.0.1:0".parse().unwrap(),
0,
None,
None,
)
.unwrap();
simulator
.set_seed_caps(Some(Uri(SEED.into())), Some(true))
.unwrap();
let mut network = client.network();
network.set_current_sim(Some(simulator));
client.set_network(network);
(client, Recording(requests))
}
fn response(status: u16, body: String) -> HttpResponse {
HttpResponse {
status_code: status,
headers: BTreeMap::new(),
content_type: Some("application/json".into()),
body: body.into_bytes(),
}
}
fn uuid() -> UUID {
UUID::random().expect("UUID Random")
}
fn item_json(
item_id: UUID,
parent_id: UUID,
asset_or_shadow_key: &str,
asset_or_shadow_value: UUID,
) -> String {
format!(
concat!(
"{{\"item_id\":\"{}\",\"parent_id\":\"{}\",",
"\"name\":\"Test Item\",\"desc\":\"A test item\",",
"\"type\":7,\"inv_type\":7,\"flags\":0,\"created_at\":1700000000,",
"\"agent_id\":\"11111111-1111-1111-1111-111111111111\",",
"\"{}\":\"{}\",\"permissions\":{{",
"\"creator_id\":\"11111111-1111-1111-1111-111111111111\",",
"\"owner_id\":\"11111111-1111-1111-1111-111111111111\",",
"\"last_owner_id\":\"11111111-1111-1111-1111-111111111111\",",
"\"group_id\":\"00000000-0000-0000-0000-000000000000\",",
"\"base_mask\":2147483647,\"owner_mask\":2147483647,",
"\"group_mask\":0,\"everyone_mask\":0,\"next_owner_mask\":2147483647,",
"\"is_owner_group\":false}},\"sale_info\":{{\"sale_price\":0,\"sale_type\":0}}}}"
),
item_id.to_string(),
parent_id.to_string(),
asset_or_shadow_key,
asset_or_shadow_value.to_string(),
)
}
fn cancellation_after(duration: Duration) -> CancellationToken {
let source = Arc::new(CancellationTokenSource::new());
let token = source.token();
std::thread::spawn(move || {
std::thread::sleep(duration);
source.cancel();
});
token
}
fn single<T: 'static>(entries: &[Box<dyn InventoryObjectClass>]) -> &T {
let mut matching = entries
.iter()
.filter_map(|entry| entry.as_any().downcast_ref::<T>());
let value = matching.next().expect("matching inventory object");
assert!(matching.next().is_none(), "expected exactly one object");
value
}
// parity-case: LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_CapAvailable_ReturnsContentsFolderAndDecryptsShadowId::test c9bfc5526260f9e2dffa8a22938999911fdd80be4b2b6d6487bf6171f8dbb56a translated
#[test]
fn cap_available_returns_contents_folder_and_decrypts_shadow_id() {
let object_id = uuid();
let item_id = uuid();
let asset_id = uuid();
let shadow_id = InventoryManager::encrypt_asset_id(asset_id).unwrap();
let body = format!(
"{{\"inventory_serial\":3,\"contents\":[{}]}}",
item_json(item_id, object_id, "shadow_id", shadow_id)
);
let (client, recording) = client_with_cap(response(200, body), true);
let result = block_on(
client
.inventory()
.get_task_inventory(object_id, 12_345, None, None),
)
.expect("GetTaskInventoryAsync");
let requests = recording.requests();
assert_eq!(requests.len(), 1);
assert!(
requests[0]
.uri
.0
.contains(&format!("task_id={}", object_id.to_string()))
);
assert_eq!(result.len(), 2);
let folder = single::<InventoryFolder>(&result);
assert_eq!(folder.base.name(), "Contents");
assert_eq!(folder.base.uuid(), object_id);
let item = single::<InventoryItem>(&result);
assert_eq!(item.base.uuid(), item_id);
assert_eq!(item.base.parent_uuid(), object_id);
assert_eq!(item.base.name(), "Test Item");
assert_eq!(item.asset_uuid(), asset_id);
}
// parity-case: LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_PlainAssetId_ParsesWithoutDecryption::test 95f39928dae61bca86b7d0a0702307db6c5fdc754e51f73a24bd5ee131e6de3f translated
#[test]
fn plain_asset_id_parses_without_decryption() {
let object_id = uuid();
let item_id = uuid();
let asset_id = uuid();
let body = format!(
"{{\"inventory_serial\":1,\"contents\":[{}]}}",
item_json(item_id, object_id, "asset_id", asset_id)
);
let (client, _) = client_with_cap(response(200, body), true);
let result = block_on(
client
.inventory()
.get_task_inventory(object_id, 12_345, None, None),
)
.expect("GetTaskInventoryAsync");
assert_eq!(single::<InventoryItem>(&result).asset_uuid(), asset_id);
}
// parity-case: LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_NonSuccessStatus_ReturnsContentsFolderOnly::test b8a25891064e470ac8d77ecd8a4847cf773b043de5ebeae275a9dd6669518585 translated
#[test]
fn non_success_status_returns_contents_folder_only() {
let object_id = uuid();
let (client, _) = client_with_cap(response(500, String::new()), true);
let result = block_on(
client
.inventory()
.get_task_inventory(object_id, 12_345, None, None),
)
.expect("GetTaskInventoryAsync");
assert_eq!(result.len(), 1);
assert!(result[0].as_any().is::<InventoryFolder>());
}
// parity-case: LibreMetaverse.Tests/RequestTaskInventoryCapTests.cs::RequestTaskInventoryCapTests.GetTaskInventoryAsync_NoCapability_DoesNotMakeHttpRequest::test c0c43ebcf781fb81b1fef7ce1dd2774e350d92ef882f49876f1a16d23a338592 translated
#[test]
fn no_capability_does_not_make_http_request() {
let (client, recording) = client_with_cap(response(404, String::new()), false);
let result = block_on(client.inventory().get_task_inventory(
uuid(),
12_345,
None,
Some(cancellation_after(Duration::from_millis(50))),
))
.expect("GetTaskInventoryAsync");
assert!(result.is_empty());
assert!(recording.requests().is_empty());
}

File diff suppressed because it is too large Load Diff

View File

@@ -73,10 +73,21 @@ WIRE_ROOT_TYPES = {
"T:LibreMetaverse.TreeDefinition",
}
COMPOSED_BASE_TYPES = {
"T:LibreMetaverse.InventoryAnimation",
"T:LibreMetaverse.InventoryAttachment",
"T:LibreMetaverse.InventoryCallingCard",
"T:LibreMetaverse.InventoryCategory",
"T:LibreMetaverse.InventoryFolder",
"T:LibreMetaverse.InventoryGesture",
"T:LibreMetaverse.InventoryItem",
"T:LibreMetaverse.InventoryLSL",
"T:LibreMetaverse.InventoryLandmark",
"T:LibreMetaverse.InventoryMaterial",
"T:LibreMetaverse.InventoryNotecard",
"T:LibreMetaverse.InventoryObject",
"T:LibreMetaverse.InventorySettings",
"T:LibreMetaverse.InventorySnapshot",
"T:LibreMetaverse.InventorySound",
"T:LibreMetaverse.InventoryTexture",
"T:LibreMetaverse.InventoryWearable",
"T:LibreMetaverse.Messages.Linden.ChatSessionAcceptInvitation",

View File

@@ -183,6 +183,107 @@ MEMBER_TYPE_OVERRIDES = {
),
}
MEMBER_SIGNATURE_OVERRIDES = {
"M:LibreMetaverse.Inventory.#ctor(LibreMetaverse.GridClient)": (
"pub fn new_with_grid_client(client: std::sync::Arc<libremetaverse::GridClient>) "
"-> Result<Self, crate::Error>",
"shared",
),
"M:LibreMetaverse.Inventory.#ctor(LibreMetaverse.GridClient,LibreMetaverse.UUID)": (
"pub fn new_with_grid_client_uuid(client: std::sync::Arc<libremetaverse::GridClient>, "
"owner: libremetaverse_types::UUID) -> Result<Self, crate::Error>",
"shared,owned",
),
"M:LibreMetaverse.Inventory.Contains(LibreMetaverse.InventoryBase)": (
"pub fn contains_with_inventory_base(&self, obj: &dyn "
"libremetaverse::InventoryObjectClass) -> Result<bool, crate::Error>",
"shared_self,shared_borrow",
),
"M:LibreMetaverse.Inventory.GetContents(LibreMetaverse.InventoryFolder)": (
"pub fn get_contents_with_inventory_folder(&self, folder: &libremetaverse::InventoryFolder) "
"-> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error>",
"shared_self,shared_borrow",
),
"M:LibreMetaverse.Inventory.GetContents(LibreMetaverse.UUID)": (
"pub fn get_contents_with_uuid(&self, folder: libremetaverse_types::UUID) "
"-> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error>",
"shared_self,owned",
),
"M:LibreMetaverse.Inventory.RemoveNodeFor(LibreMetaverse.InventoryBase)": (
"pub fn remove_node_for(&self, item: &dyn libremetaverse::InventoryObjectClass) "
"-> Result<(), crate::Error>",
"shared_self,shared_borrow",
),
"M:LibreMetaverse.Inventory.TryGetValue(LibreMetaverse.UUID,LibreMetaverse.InventoryBase@)": (
"pub fn try_get_value_with_uuid_inventory_base(&self, uuid: libremetaverse_types::UUID, "
"item: &mut Option<Box<dyn libremetaverse::InventoryObjectClass>>) "
"-> Result<bool, crate::Error>",
"shared_self,owned,mutable_output",
),
"M:LibreMetaverse.Inventory.UpdateNodeFor(LibreMetaverse.InventoryBase)": (
"pub fn update_node_for(&self, item: &dyn libremetaverse::InventoryObjectClass) "
"-> Result<(), crate::Error>",
"shared_self,shared_borrow",
),
"M:LibreMetaverse.InventoryAISClient.#ctor(LibreMetaverse.GridClient)": (
"pub fn new(client: Option<std::sync::Arc<libremetaverse::GridClient>>) "
"-> Result<Self, crate::Error>",
"optional_shared",
),
"M:LibreMetaverse.InventoryAISClient.ParseEmbedded(LibreMetaverse.StructuredData.OSDMap,System.Collections.Generic.List{LibreMetaverse.InventoryFolder}@,System.Collections.Generic.List{LibreMetaverse.InventoryItem}@,System.Collections.Generic.List{LibreMetaverse.InventoryItem}@)": (
"pub fn parse_embedded(&self, response: libremetaverse_structured_data::OSD, "
"folders: &mut Option<Vec<libremetaverse::InventoryFolder>>, items: &mut "
"Option<Vec<libremetaverse::InventoryItem>>, links: &mut "
"Option<Vec<libremetaverse::InventoryItem>>) "
"-> Result<(), crate::Error>",
"shared_self,owned,mutable_output,mutable_output,mutable_output",
),
"M:LibreMetaverse.InventoryAISClient.ParseItemsFromEmbedded(LibreMetaverse.StructuredData.OSDMap)": (
"pub fn parse_items_from_embedded(&self, response: "
"Option<libremetaverse_structured_data::OSD>) -> Result<Vec<libremetaverse::InventoryItem>, "
"crate::Error>",
"shared_self,optional_owned",
),
"M:LibreMetaverse.InventoryAISClient.ParseLinksFromEmbedded(LibreMetaverse.StructuredData.OSDMap)": (
"pub fn parse_links_from_embedded(&self, response: "
"Option<libremetaverse_structured_data::OSD>) -> Result<Vec<libremetaverse::InventoryItem>, "
"crate::Error>",
"shared_self,optional_owned",
),
"M:LibreMetaverse.InventoryManager.#ctor(LibreMetaverse.GridClient)": (
"pub fn new(client: Option<std::sync::Arc<libremetaverse::GridClient>>) "
"-> Result<Self, crate::Error>",
"optional_shared",
),
"M:LibreMetaverse.InventoryManager.CreateInventoryItem(LibreMetaverse.InventoryType,LibreMetaverse.UUID)": (
"pub fn create_inventory_item(type_: libremetaverse_types::InventoryType, id: "
"libremetaverse_types::UUID) -> Result<Box<dyn "
"libremetaverse::InventoryItemClass>, crate::Error>",
"owned,owned",
),
"M:LibreMetaverse.InventoryManager.FolderContentsAsync(LibreMetaverse.UUID,LibreMetaverse.UUID,System.Boolean,System.Boolean,LibreMetaverse.InventorySortOrder,System.Threading.CancellationToken,System.Boolean)": (
"pub async fn folder_contents(&self, folder: libremetaverse_types::UUID, owner: "
"libremetaverse_types::UUID, fetch_folders: bool, fetch_items: bool, order: "
"libremetaverse::InventorySortOrder, cancellation_token: "
"Option<libremetaverse_types::compat::CancellationToken>, follow_links: Option<bool>) "
"-> Result<Vec<Box<dyn libremetaverse::InventoryObjectClass>>, crate::Error>",
"shared_self,owned,owned,owned,owned,owned,optional_owned,optional_owned",
),
"M:LibreMetaverse.InventoryManager.GetTaskInventoryAsync(LibreMetaverse.UUID,System.UInt32,LibreMetaverse.Simulator,System.Threading.CancellationToken)": (
"pub async fn get_task_inventory(&self, object_id: libremetaverse_types::UUID, "
"object_local_id: u32, simulator: Option<libremetaverse::Simulator>, cancellation_token: "
"Option<libremetaverse_types::compat::CancellationToken>) -> Result<Vec<Box<dyn "
"libremetaverse::InventoryObjectClass>>, crate::Error>",
"shared_self,owned,owned,optional_owned,optional_owned",
),
"M:LibreMetaverse.InventoryManager.ItemCRC(LibreMetaverse.InventoryItem)": (
"pub fn item_crc(iitem: &libremetaverse::InventoryItem) -> Result<u32, crate::Error>",
"shared_borrow",
),
"M:LibreMetaverse.InventoryNode.#ctor(LibreMetaverse.InventoryBase)": (
"pub fn new_with_inventory_base(data: &dyn libremetaverse::InventoryObjectClass) "
"-> Result<Self, crate::Error>",
"shared_borrow",
),
"M:LibreMetaverse.AvatarAppearanceEventArgs.#ctor(LibreMetaverse.Simulator,LibreMetaverse.UUID,System.Boolean,LibreMetaverse.Primitive.TextureEntryFace,LibreMetaverse.Primitive.TextureEntryFace[],System.Collections.Generic.List{System.Byte},System.Byte,System.Int32,LibreMetaverse.AppearanceFlags,System.Int32)": (
"pub fn new(sim: Option<libremetaverse::Simulator>, avatar_id: libremetaverse_types::UUID, "
"is_trial: bool, default_texture: libremetaverse::PrimitiveTextureEntryFace, face_textures: "
@@ -352,6 +453,12 @@ MEMBER_SIGNATURE_OVERRIDES = {
),
}
PROPERTY_SIGNATURE_OVERRIDES = {
"P:LibreMetaverse.InventoryNode.Data": (
"pub fn data(&self) -> Option<Box<dyn libremetaverse::InventoryObjectClass>> ; "
"pub fn set_data(&mut self, value: Option<Box<dyn "
"libremetaverse::InventoryObjectClass>>)",
"shared_or_mutable_self",
),
"P:LibreMetaverse.AppearanceManager.TextureProvider": (
"pub fn texture_provider(&self) -> std::sync::Arc<dyn libremetaverse::IBakingTextureProvider> ; "
"pub fn set_texture_provider(&mut self, value: std::sync::Arc<dyn "