Translate asset and material parity tests
Some checks failed
Rust API gates / api-gates (push) Has been cancelled

This commit is contained in:
2026-08-08 15:29:02 +02:00
parent 069e6366b2
commit 9eb4345750
15 changed files with 3735 additions and 3093 deletions

View File

@@ -59,9 +59,9 @@ The current workspace is a structural baseline, not a working client:
members with real fields/constants/enum values and standardized failing members with real fields/constants/enum values and standardized failing
bodies; bodies;
- all 1,289 discovered NUnit `[Test]`/`[TestCase]` cases have compiling Rust test - all 1,289 discovered NUnit `[Test]`/`[TestCase]` cases have compiling Rust test
entries; 149 cases are semantically translated, three live-grid cases are entries; 205 cases are semantically translated, three live-grid cases are
reviewed and ignored by default, four benchmarks are reviewed, and the other reviewed and ignored by default, four benchmarks are reviewed, and the other
1,133 intentionally panic with their source identity and body hash; 1,077 intentionally panic with their source identity and body hash;
- all nine sample/tool projects have compiling Rust binary targets; - all nine sample/tool projects have compiling Rust binary targets;
- the 128 TestClient command source files are retained as a command inventory. - the 128 TestClient command source files are retained as a command inventory.
@@ -332,8 +332,8 @@ markers in hand-written Rust files, so regeneration writes only unresolved
placeholders and fails on body drift. The checked-in audit reports pending, placeholders and fails on body drift. The checked-in audit reports pending,
translated, ignored-live, benchmark, drifted, missing, duplicate, stale, and translated, ignored-live, benchmark, drifted, missing, duplicate, stale, and
unreviewed cases. The initial handover contained 1,289 unreviewed cases; the unreviewed cases. The initial handover contained 1,289 unreviewed cases; the
current ledger contains 149 translated, three ignored-live, four current ledger contains 205 translated, three ignored-live, four
benchmark-reviewed, and 1,133 pending cases. benchmark-reviewed, and 1,077 pending cases.
The Rust tests must call the public APIs rather than internal replacements. The Rust tests must call the public APIs rather than internal replacements.
Where the C# tests call internal members through friend-assembly access, record 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** - Properties/indexers/events: **5,090 / 11 / 268**
- Delegates and flags enums: **40 / 46** - Delegates and flags enums: **40 / 46**
- Optional/ref/out/in parameters: **470 / 6,144 / 555 / 0** - Optional/ref/out/in parameters: **470 / 6,144 / 555 / 0**
- Async Rust signatures: **334** - Async Rust signatures: **332**
- Descriptively renamed overloads: **7,151** - Descriptively renamed overloads: **7,151**
- Explicit CLR delegate APM differences: **80** - Explicit CLR delegate APM differences: **80**

View File

@@ -10473,7 +10473,7 @@ M:LibreMetaverse.AssetCache.TryGetCachedAssetBytes(LibreMetaverse.UUID,System.By
M:LibreMetaverse.AssetCache.TryGetCachedAssetBytesAsync(LibreMetaverse.UUID,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.ValueTuple<System.Boolean, System.Byte[]>> LibreMetaverse.AssetCache.TryGetCachedAssetBytesAsync(LibreMetaverse.UUID assetID, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::AssetCache::try_get_cached_asset_bytes_with_uuid_cancellation_token pub async fn try_get_cached_asset_bytes_with_uuid_cancellation_token(&self, asset_id: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(bool, Option<Vec<u8>>), crate::Error> shared_self,owned,optional_owned async Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.AssetCache.TryGetCachedAssetBytesAsync(LibreMetaverse.UUID,System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.ValueTuple<System.Boolean, System.Byte[]>> LibreMetaverse.AssetCache.TryGetCachedAssetBytesAsync(LibreMetaverse.UUID assetID, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::AssetCache::try_get_cached_asset_bytes_with_uuid_cancellation_token pub async fn try_get_cached_asset_bytes_with_uuid_cancellation_token(&self, asset_id: libremetaverse_types::UUID, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<(bool, Option<Vec<u8>>), crate::Error> shared_self,owned,optional_owned async Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.AssetCacheSettings.#ctor constructor LibreMetaverse.AssetCacheSettings() libremetaverse libremetaverse::AssetCacheSettings::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.AssetCacheSettings.#ctor constructor LibreMetaverse.AssetCacheSettings() libremetaverse libremetaverse::AssetCacheSettings::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.AssetDownload.#ctor constructor LibreMetaverse.AssetDownload() libremetaverse libremetaverse::AssetDownload::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.AssetDownload.#ctor constructor LibreMetaverse.AssetDownload() libremetaverse libremetaverse::AssetDownload::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.AssetManager.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.AssetManager(LibreMetaverse.GridClient client) libremetaverse libremetaverse::AssetManager::new pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.AssetManager.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.AssetManager(LibreMetaverse.GridClient client) libremetaverse libremetaverse::AssetManager::new pub fn new(client: Option<libremetaverse::GridClient>) -> Result<Self, crate::Error> optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.AssetManager.AssetTypeToString(LibreMetaverse.AssetType) method System.String LibreMetaverse.AssetManager.AssetTypeToString(LibreMetaverse.AssetType assetType) libremetaverse libremetaverse::AssetManager::asset_type_to_string pub fn asset_type_to_string(&self, asset_type: libremetaverse_types::AssetType) -> Result<String, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.AssetManager.AssetTypeToString(LibreMetaverse.AssetType) method System.String LibreMetaverse.AssetManager.AssetTypeToString(LibreMetaverse.AssetType assetType) libremetaverse libremetaverse::AssetManager::asset_type_to_string pub fn asset_type_to_string(&self, asset_type: libremetaverse_types::AssetType) -> Result<String, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.AssetManager.CreateAssetWrapper(LibreMetaverse.AssetType) method LibreMetaverse.Assets.Asset LibreMetaverse.AssetManager.CreateAssetWrapper(LibreMetaverse.AssetType type) libremetaverse libremetaverse::AssetManager::create_asset_wrapper pub fn create_asset_wrapper(&self, type_: libremetaverse_types::AssetType) -> Result<libremetaverse::assets::Asset, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.AssetManager.CreateAssetWrapper(LibreMetaverse.AssetType) method LibreMetaverse.Assets.Asset LibreMetaverse.AssetManager.CreateAssetWrapper(LibreMetaverse.AssetType type) libremetaverse libremetaverse::AssetManager::create_asset_wrapper pub fn create_asset_wrapper(&self, type_: libremetaverse_types::AssetType) -> Result<libremetaverse::assets::Asset, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.AssetManager.GetTextureUploadCost(System.Int32) method System.Int32 LibreMetaverse.AssetManager.GetTextureUploadCost(System.Int32 widthPixels) libremetaverse libremetaverse::AssetManager::get_texture_upload_cost pub fn get_texture_upload_cost(&self, width_pixels: i32) -> Result<i32, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.AssetManager.GetTextureUploadCost(System.Int32) method System.Int32 LibreMetaverse.AssetManager.GetTextureUploadCost(System.Int32 widthPixels) libremetaverse libremetaverse::AssetManager::get_texture_upload_cost pub fn get_texture_upload_cost(&self, width_pixels: i32) -> Result<i32, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
@@ -10520,22 +10520,22 @@ M:LibreMetaverse.Assets.AssetLandmark.Decode method System.Boolean LibreMetavers
M:LibreMetaverse.Assets.AssetLandmark.Encode method System.Void LibreMetaverse.Assets.AssetLandmark.Encode() libremetaverse assets libremetaverse::assets::AssetLandmark::encode pub fn encode(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetLandmark.Encode method System.Void LibreMetaverse.Assets.AssetLandmark.Encode() libremetaverse assets libremetaverse::assets::AssetLandmark::encode pub fn encode(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.#ctor constructor LibreMetaverse.Assets.AssetMaterial() libremetaverse assets libremetaverse::assets::AssetMaterial::new_with_constructor pub fn new_with_constructor() -> Result<Self, crate::Error> none sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.Assets.AssetMaterial.#ctor constructor LibreMetaverse.Assets.AssetMaterial() libremetaverse assets libremetaverse::assets::AssetMaterial::new_with_constructor pub fn new_with_constructor() -> Result<Self, crate::Error> none sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Assets.AssetMaterial.#ctor(LibreMetaverse.UUID,System.Byte[]) constructor LibreMetaverse.Assets.AssetMaterial(LibreMetaverse.UUID assetId, System.Byte[] assetData) libremetaverse assets libremetaverse::assets::AssetMaterial::new_with_uuid_bytes pub fn new_with_uuid_bytes(asset_id: libremetaverse_types::UUID, asset_data: Vec<u8>) -> Result<Self, crate::Error> owned,owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.Assets.AssetMaterial.#ctor(LibreMetaverse.UUID,System.Byte[]) constructor LibreMetaverse.Assets.AssetMaterial(LibreMetaverse.UUID assetId, System.Byte[] assetData) libremetaverse assets libremetaverse::assets::AssetMaterial::new_with_uuid_bytes pub fn new_with_uuid_bytes(asset_id: libremetaverse_types::UUID, asset_data: Vec<u8>) -> Result<Self, crate::Error> owned,owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Assets.AssetMaterial.ApplyOverride(LibreMetaverse.Assets.AssetMaterial) method System.Void LibreMetaverse.Assets.AssetMaterial.ApplyOverride(LibreMetaverse.Assets.AssetMaterial overrideMat) libremetaverse assets libremetaverse::assets::AssetMaterial::apply_override pub fn apply_override(&self, override_mat: libremetaverse::assets::AssetMaterial) -> Result<(), crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.ApplyOverride(LibreMetaverse.Assets.AssetMaterial) method System.Void LibreMetaverse.Assets.AssetMaterial.ApplyOverride(LibreMetaverse.Assets.AssetMaterial overrideMat) libremetaverse assets libremetaverse::assets::AssetMaterial::apply_override pub fn apply_override(&mut self, override_mat: libremetaverse::assets::AssetMaterial) -> Result<(), crate::Error> mutable_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.Decode method System.Boolean LibreMetaverse.Assets.AssetMaterial.Decode() libremetaverse assets libremetaverse::assets::AssetMaterial::decode pub fn decode(&self) -> Result<bool, crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.Decode method System.Boolean LibreMetaverse.Assets.AssetMaterial.Decode() libremetaverse assets libremetaverse::assets::AssetMaterial::decode pub fn decode(&mut self) -> Result<bool, crate::Error> mutable_self sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.Encode method System.Void LibreMetaverse.Assets.AssetMaterial.Encode() libremetaverse assets libremetaverse::assets::AssetMaterial::encode pub fn encode(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.Encode method System.Void LibreMetaverse.Assets.AssetMaterial.Encode() libremetaverse assets libremetaverse::assets::AssetMaterial::encode pub fn encode(&mut self) -> Result<(), crate::Error> mutable_self sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.FromOverrideOsd(LibreMetaverse.StructuredData.OSDMap) method LibreMetaverse.Assets.AssetMaterial LibreMetaverse.Assets.AssetMaterial.FromOverrideOsd(LibreMetaverse.StructuredData.OSDMap data) libremetaverse assets libremetaverse::assets::AssetMaterial::from_override_osd pub fn from_override_osd(data: libremetaverse_structured_data::OSDMap) -> Result<libremetaverse::assets::AssetMaterial, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.FromOverrideOsd(LibreMetaverse.StructuredData.OSDMap) method LibreMetaverse.Assets.AssetMaterial LibreMetaverse.Assets.AssetMaterial.FromOverrideOsd(LibreMetaverse.StructuredData.OSDMap data) libremetaverse assets libremetaverse::assets::AssetMaterial::from_override_osd pub fn from_override_osd(data: libremetaverse_structured_data::OSDMap) -> Result<libremetaverse::assets::AssetMaterial, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetAlphaCutoff(System.Single,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetAlphaCutoff(System.Single cutoff, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_alpha_cutoff_with_single_boolean pub fn set_alpha_cutoff_with_single_boolean(&self, cutoff: f32, for_override: Option<bool>) -> Result<(), crate::Error> shared_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.Assets.AssetMaterial.SetAlphaCutoff(System.Single,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetAlphaCutoff(System.Single cutoff, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_alpha_cutoff_with_single_boolean pub fn set_alpha_cutoff_with_single_boolean(&mut self, cutoff: f32, for_override: Option<bool>) -> Result<(), crate::Error> mutable_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetAlphaMode(LibreMetaverse.Assets.GltfAlphaMode,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetAlphaMode(LibreMetaverse.Assets.GltfAlphaMode mode, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_alpha_mode_with_gltf_alpha_mode_boolean pub fn set_alpha_mode_with_gltf_alpha_mode_boolean(&self, mode: libremetaverse::assets::GltfAlphaMode, for_override: Option<bool>) -> Result<(), crate::Error> shared_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.Assets.AssetMaterial.SetAlphaMode(LibreMetaverse.Assets.GltfAlphaMode,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetAlphaMode(LibreMetaverse.Assets.GltfAlphaMode mode, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_alpha_mode_with_gltf_alpha_mode_boolean pub fn set_alpha_mode_with_gltf_alpha_mode_boolean(&mut self, mode: libremetaverse::assets::GltfAlphaMode, for_override: Option<bool>) -> Result<(), crate::Error> mutable_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetBaseColorFactor(LibreMetaverse.Color4,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetBaseColorFactor(LibreMetaverse.Color4 color, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_base_color_factor_with_color4_boolean pub fn set_base_color_factor_with_color4_boolean(&self, color: libremetaverse_types::Color4, for_override: Option<bool>) -> Result<(), crate::Error> shared_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.Assets.AssetMaterial.SetBaseColorFactor(LibreMetaverse.Color4,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetBaseColorFactor(LibreMetaverse.Color4 color, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_base_color_factor_with_color4_boolean pub fn set_base_color_factor_with_color4_boolean(&mut self, color: libremetaverse_types::Color4, for_override: Option<bool>) -> Result<(), crate::Error> mutable_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetBaseMaterial method System.Void LibreMetaverse.Assets.AssetMaterial.SetBaseMaterial() libremetaverse assets libremetaverse::assets::AssetMaterial::set_base_material pub fn set_base_material(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.SetBaseMaterial method System.Void LibreMetaverse.Assets.AssetMaterial.SetBaseMaterial() libremetaverse assets libremetaverse::assets::AssetMaterial::set_base_material pub fn set_base_material(&mut self) -> Result<(), crate::Error> mutable_self sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetDoubleSided(System.Boolean,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetDoubleSided(System.Boolean doubleSided, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_double_sided_with_boolean_boolean pub fn set_double_sided_with_boolean_boolean(&self, double_sided: bool, for_override: Option<bool>) -> Result<(), crate::Error> shared_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.Assets.AssetMaterial.SetDoubleSided(System.Boolean,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetDoubleSided(System.Boolean doubleSided, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_double_sided_with_boolean_boolean pub fn set_double_sided_with_boolean_boolean(&mut self, double_sided: bool, for_override: Option<bool>) -> Result<(), crate::Error> mutable_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetEmissiveFactor(LibreMetaverse.Vector3,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetEmissiveFactor(LibreMetaverse.Vector3 color, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_emissive_factor_with_vector3_boolean pub fn set_emissive_factor_with_vector3_boolean(&self, color: libremetaverse_types::Vector3, for_override: Option<bool>) -> Result<(), crate::Error> shared_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.Assets.AssetMaterial.SetEmissiveFactor(LibreMetaverse.Vector3,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetEmissiveFactor(LibreMetaverse.Vector3 color, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_emissive_factor_with_vector3_boolean pub fn set_emissive_factor_with_vector3_boolean(&mut self, color: libremetaverse_types::Vector3, for_override: Option<bool>) -> Result<(), crate::Error> mutable_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetMetallicFactor(System.Single,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetMetallicFactor(System.Single metallic, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_metallic_factor_with_single_boolean pub fn set_metallic_factor_with_single_boolean(&self, metallic: f32, for_override: Option<bool>) -> Result<(), crate::Error> shared_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.Assets.AssetMaterial.SetMetallicFactor(System.Single,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetMetallicFactor(System.Single metallic, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_metallic_factor_with_single_boolean pub fn set_metallic_factor_with_single_boolean(&mut self, metallic: f32, for_override: Option<bool>) -> Result<(), crate::Error> mutable_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetRoughnessFactor(System.Single,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetRoughnessFactor(System.Single roughness, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_roughness_factor_with_single_boolean pub fn set_roughness_factor_with_single_boolean(&self, roughness: f32, for_override: Option<bool>) -> Result<(), crate::Error> shared_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.Assets.AssetMaterial.SetRoughnessFactor(System.Single,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetRoughnessFactor(System.Single roughness, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_roughness_factor_with_single_boolean pub fn set_roughness_factor_with_single_boolean(&mut self, roughness: f32, for_override: Option<bool>) -> Result<(), crate::Error> mutable_self,owned,optional_owned sync Result<_, crate::Error> descriptive_overload_name method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetTextureId(System.Int32,LibreMetaverse.UUID,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetTextureId(System.Int32 slot, LibreMetaverse.UUID id, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_texture_id pub fn set_texture_id(&self, slot: i32, id: libremetaverse_types::UUID, for_override: Option<bool>) -> Result<(), crate::Error> shared_self,owned,owned,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.SetTextureId(System.Int32,LibreMetaverse.UUID,System.Boolean) method System.Void LibreMetaverse.Assets.AssetMaterial.SetTextureId(System.Int32 slot, LibreMetaverse.UUID id, System.Boolean forOverride = default) libremetaverse assets libremetaverse::assets::AssetMaterial::set_texture_id pub fn set_texture_id(&mut self, slot: i32, id: libremetaverse_types::UUID, for_override: Option<bool>) -> Result<(), crate::Error> mutable_self,owned,owned,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetTextureOffset(System.Int32,LibreMetaverse.Vector2) method System.Void LibreMetaverse.Assets.AssetMaterial.SetTextureOffset(System.Int32 slot, LibreMetaverse.Vector2 offset) libremetaverse assets libremetaverse::assets::AssetMaterial::set_texture_offset pub fn set_texture_offset(&self, slot: i32, offset: libremetaverse_types::Vector2) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.SetTextureOffset(System.Int32,LibreMetaverse.Vector2) method System.Void LibreMetaverse.Assets.AssetMaterial.SetTextureOffset(System.Int32 slot, LibreMetaverse.Vector2 offset) libremetaverse assets libremetaverse::assets::AssetMaterial::set_texture_offset pub fn set_texture_offset(&mut self, slot: i32, offset: libremetaverse_types::Vector2) -> Result<(), crate::Error> mutable_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetTextureRotation(System.Int32,System.Single) method System.Void LibreMetaverse.Assets.AssetMaterial.SetTextureRotation(System.Int32 slot, System.Single rotation) libremetaverse assets libremetaverse::assets::AssetMaterial::set_texture_rotation pub fn set_texture_rotation(&self, slot: i32, rotation: f32) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.SetTextureRotation(System.Int32,System.Single) method System.Void LibreMetaverse.Assets.AssetMaterial.SetTextureRotation(System.Int32 slot, System.Single rotation) libremetaverse assets libremetaverse::assets::AssetMaterial::set_texture_rotation pub fn set_texture_rotation(&mut self, slot: i32, rotation: f32) -> Result<(), crate::Error> mutable_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.SetTextureScale(System.Int32,LibreMetaverse.Vector2) method System.Void LibreMetaverse.Assets.AssetMaterial.SetTextureScale(System.Int32 slot, LibreMetaverse.Vector2 scale) libremetaverse assets libremetaverse::assets::AssetMaterial::set_texture_scale pub fn set_texture_scale(&self, slot: i32, scale: libremetaverse_types::Vector2) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.SetTextureScale(System.Int32,LibreMetaverse.Vector2) method System.Void LibreMetaverse.Assets.AssetMaterial.SetTextureScale(System.Int32 slot, LibreMetaverse.Vector2 scale) libremetaverse assets libremetaverse::assets::AssetMaterial::set_texture_scale pub fn set_texture_scale(&mut self, slot: i32, scale: libremetaverse_types::Vector2) -> Result<(), crate::Error> mutable_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.ToJson method System.String LibreMetaverse.Assets.AssetMaterial.ToJson() libremetaverse assets libremetaverse::assets::AssetMaterial::to_json pub fn to_json(&self) -> Result<String, crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.ToJson method System.String LibreMetaverse.Assets.AssetMaterial.ToJson() libremetaverse assets libremetaverse::assets::AssetMaterial::to_json pub fn to_json(&self) -> Result<String, crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMaterial.ToOverrideOsd method LibreMetaverse.StructuredData.OSDMap LibreMetaverse.Assets.AssetMaterial.ToOverrideOsd() libremetaverse assets libremetaverse::assets::AssetMaterial::to_override_osd pub fn to_override_osd(&self) -> Result<libremetaverse_structured_data::OSDMap, crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.Assets.AssetMaterial.ToOverrideOsd method LibreMetaverse.StructuredData.OSDMap LibreMetaverse.Assets.AssetMaterial.ToOverrideOsd() libremetaverse assets libremetaverse::assets::AssetMaterial::to_override_osd pub fn to_override_osd(&self) -> Result<libremetaverse_structured_data::OSDMap, crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.Assets.AssetMesh.#ctor constructor LibreMetaverse.Assets.AssetMesh() libremetaverse assets libremetaverse::assets::AssetMesh::new_with_constructor pub fn new_with_constructor() -> Result<Self, crate::Error> none sync Result<_, crate::Error> descriptive_overload_name method mapped M:LibreMetaverse.Assets.AssetMesh.#ctor constructor LibreMetaverse.Assets.AssetMesh() libremetaverse assets libremetaverse::assets::AssetMesh::new_with_constructor pub fn new_with_constructor() -> Result<Self, crate::Error> none sync Result<_, crate::Error> descriptive_overload_name method mapped
@@ -24948,8 +24948,8 @@ M:LibreMetaverse.TerrainCompressor.DecodePatchHeader(LibreMetaverse.BitPack,Syst
M:LibreMetaverse.TerrainCompressor.DecompressPatch(System.Int32[],LibreMetaverse.TerrainPatch.Header,LibreMetaverse.TerrainPatch.GroupHeader) method System.Single[] LibreMetaverse.TerrainCompressor.DecompressPatch(System.Int32[] patches, LibreMetaverse.TerrainPatch.Header header, LibreMetaverse.TerrainPatch.GroupHeader group) libremetaverse libremetaverse::TerrainCompressor::decompress_patch pub fn decompress_patch(patches: Vec<i32>, header: libremetaverse::TerrainPatchHeader, group: libremetaverse::TerrainPatchGroupHeader) -> Result<Vec<f32>, crate::Error> owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.TerrainCompressor.DecompressPatch(System.Int32[],LibreMetaverse.TerrainPatch.Header,LibreMetaverse.TerrainPatch.GroupHeader) method System.Single[] LibreMetaverse.TerrainCompressor.DecompressPatch(System.Int32[] patches, LibreMetaverse.TerrainPatch.Header header, LibreMetaverse.TerrainPatch.GroupHeader group) libremetaverse libremetaverse::TerrainCompressor::decompress_patch pub fn decompress_patch(patches: Vec<i32>, header: libremetaverse::TerrainPatchHeader, group: libremetaverse::TerrainPatchGroupHeader) -> Result<Vec<f32>, crate::Error> owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.TerrainManager.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.TerrainManager(LibreMetaverse.GridClient client) libremetaverse libremetaverse::TerrainManager::new pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.TerrainManager.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.TerrainManager(LibreMetaverse.GridClient client) libremetaverse libremetaverse::TerrainManager::new pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.TerrainManager.Dispose method System.Void LibreMetaverse.TerrainManager.Dispose() libremetaverse libremetaverse::TerrainManager::dispose pub fn dispose(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.TerrainManager.Dispose method System.Void LibreMetaverse.TerrainManager.Dispose() libremetaverse libremetaverse::TerrainManager::dispose pub fn dispose(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.Assets.AssetMaterial[]> LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::TerrainManager::get_terrain_material_overrides pub async fn get_terrain_material_overrides(&self, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Option<Vec<libremetaverse::assets::AssetMaterial>>, crate::Error> shared_self,optional_owned async Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken) method System.Threading.Tasks.Task<LibreMetaverse.Assets.AssetMaterial[]> LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::TerrainManager::get_terrain_material_overrides pub async fn get_terrain_material_overrides(&self, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<Option<Vec<Option<libremetaverse::assets::AssetMaterial>>>, crate::Error> shared_self,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[],System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[] overrides, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::TerrainManager::set_terrain_material_overrides pub async fn set_terrain_material_overrides(&self, overrides: Vec<libremetaverse::assets::AssetMaterial>, 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.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[],System.Threading.CancellationToken) method System.Threading.Tasks.Task<System.Boolean> LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[] overrides, System.Threading.CancellationToken cancellationToken = default) libremetaverse libremetaverse::TerrainManager::set_terrain_material_overrides pub async fn set_terrain_material_overrides(&self, overrides: Vec<Option<libremetaverse::assets::AssetMaterial>>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error> shared_self,owned,optional_owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.TerrainPatch.#ctor constructor LibreMetaverse.TerrainPatch() libremetaverse libremetaverse::TerrainPatch::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.TerrainPatch.#ctor constructor LibreMetaverse.TerrainPatch() libremetaverse libremetaverse::TerrainPatch::new pub fn new() -> Result<Self, crate::Error> none sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.TerrainPatch.Header.setPatchIDs(System.Int32,System.Int32) method System.Int32 LibreMetaverse.TerrainPatch.Header.setPatchIDs(System.Int32 xx, System.Int32 yy) libremetaverse libremetaverse::TerrainPatchHeader::set_patch_i_ds pub fn set_patch_i_ds(&mut self, xx: i32, yy: i32) -> Result<i32, crate::Error> mutable_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.TerrainPatch.Header.setPatchIDs(System.Int32,System.Int32) method System.Int32 LibreMetaverse.TerrainPatch.Header.setPatchIDs(System.Int32 xx, System.Int32 yy) libremetaverse libremetaverse::TerrainPatchHeader::set_patch_i_ds pub fn set_patch_i_ds(&mut self, xx: i32, yy: i32) -> Result<i32, crate::Error> mutable_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
M:LibreMetaverse.TerseObjectUpdateEventArgs.#ctor(LibreMetaverse.Simulator,LibreMetaverse.Primitive,LibreMetaverse.ObjectMovementUpdate,System.UInt16) constructor LibreMetaverse.TerseObjectUpdateEventArgs(LibreMetaverse.Simulator simulator, LibreMetaverse.Primitive prim, LibreMetaverse.ObjectMovementUpdate update, System.UInt16 timeDilation) libremetaverse libremetaverse::TerseObjectUpdateEventArgs::new pub fn new(simulator: libremetaverse::Simulator, prim: libremetaverse::Primitive, update: libremetaverse::ObjectMovementUpdate, time_dilation: u16) -> Result<Self, crate::Error> owned,owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped M:LibreMetaverse.TerseObjectUpdateEventArgs.#ctor(LibreMetaverse.Simulator,LibreMetaverse.Primitive,LibreMetaverse.ObjectMovementUpdate,System.UInt16) constructor LibreMetaverse.TerseObjectUpdateEventArgs(LibreMetaverse.Simulator simulator, LibreMetaverse.Primitive prim, LibreMetaverse.ObjectMovementUpdate update, System.UInt16 timeDilation) libremetaverse libremetaverse::TerseObjectUpdateEventArgs::new pub fn new(simulator: libremetaverse::Simulator, prim: libremetaverse::Primitive, update: libremetaverse::ObjectMovementUpdate, time_dilation: u16) -> Result<Self, crate::Error> owned,owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
Can't render this file because it is too large.

View File

@@ -51,6 +51,8 @@ pub enum Error {
ArgumentNull, ArgumentNull,
/// An argument value or length was invalid. /// An argument value or length was invalid.
Argument, Argument,
/// The requested operation was not valid in the object's current state.
InvalidOperation,
/// An index or destination buffer boundary was exceeded. /// An index or destination buffer boundary was exceeded.
IndexOutOfRange, IndexOutOfRange,
/// An operation observed a requested cancellation. /// An operation observed a requested cancellation.
@@ -63,7 +65,11 @@ impl Error {
pub const fn csharp_member(self) -> Option<&'static str> { pub const fn csharp_member(self) -> Option<&'static str> {
match self { match self {
Self::NotImplemented(error) => Some(error.csharp_member()), Self::NotImplemented(error) => Some(error.csharp_member()),
Self::ArgumentNull | Self::Argument | Self::IndexOutOfRange | Self::Cancelled => None, Self::ArgumentNull
| Self::Argument
| Self::InvalidOperation
| Self::IndexOutOfRange
| Self::Cancelled => None,
} }
} }
} }
@@ -80,6 +86,7 @@ impl fmt::Display for Error {
Self::NotImplemented(error) => error.fmt(formatter), Self::NotImplemented(error) => error.fmt(formatter),
Self::ArgumentNull => formatter.write_str("required argument was null"), Self::ArgumentNull => formatter.write_str("required argument was null"),
Self::Argument => formatter.write_str("argument was invalid"), Self::Argument => formatter.write_str("argument was invalid"),
Self::InvalidOperation => formatter.write_str("operation was invalid for this state"),
Self::IndexOutOfRange => formatter.write_str("index was out of range"), Self::IndexOutOfRange => formatter.write_str("index was out of range"),
Self::Cancelled => formatter.write_str("operation was cancelled"), Self::Cancelled => formatter.write_str("operation was cancelled"),
} }
@@ -152,5 +159,9 @@ mod tests {
.expect("placeholder panic must retain its visible marker"); .expect("placeholder panic must retain its visible marker");
assert_eq!(message, &format!("{PANIC_PREFIX}{MEMBER}")); assert_eq!(message, &format!("{PANIC_PREFIX}{MEMBER}"));
assert!(not_implemented::<()>(MEMBER).is_err()); assert!(not_implemented::<()>(MEMBER).is_err());
assert_eq!(
Error::InvalidOperation.to_string(),
"operation was invalid for this state"
);
} }
} }

View File

@@ -0,0 +1,92 @@
// The upstream tests reach the internal OarFile.LoadTerrain member via reflection.
// Keep the equivalent Rust seam private to the owning crate.
// BSD-3-Clause source (see LICENSE.md): LibreMetaverse.Tests/OarFileTerrainTests.cs
// SHA-256: 19c42f7f132b97dc1667208f1e9b49df8ff6db96265c22b1c1ef5498e3c5c75d
#![allow(clippy::float_cmp)]
use crate::Error;
use crate::assets::OarFile;
use std::sync::{Arc, Mutex};
type Terrain = Vec<Vec<f32>>;
type TerrainLoaded = Box<dyn Fn(Terrain, i64, i64) + Send + Sync>;
impl OarFile {
fn load_terrain(
_file_path: &str,
_data: Vec<u8>,
_callback: TerrainLoaded,
_bytes_read: i64,
_total_bytes: i64,
) -> Result<bool, Error> {
libremetaverse_types::not_implemented(
"M:LibreMetaverse.Assets.OarFile.LoadTerrain(System.String,System.Byte[],LibreMetaverse.Assets.OarFile.TerrainLoadedCallback,System.Int64,System.Int64)",
)
}
}
fn raw_terrain(side: usize, fill: f32) -> Vec<u8> {
fill.to_le_bytes().repeat(side * side)
}
fn invoke_load_terrain(file_path: &str, data: Vec<u8>) -> (bool, Option<Terrain>) {
let captured = Arc::new(Mutex::new(None));
let callback_capture = Arc::clone(&captured);
let total_bytes = i64::try_from(data.len()).expect("terrain byte count fits i64");
let loaded = OarFile::load_terrain(
file_path,
data,
Box::new(move |terrain, _, _| {
*callback_capture.lock().expect("terrain capture") = Some(terrain);
}),
0,
total_bytes,
)
.expect("OarFile.LoadTerrain");
let terrain = captured.lock().expect("terrain capture").take();
(loaded, terrain)
}
// Fixture SHA-256: fcdd41fbadfe6a69d9687b3777692c2de82c831856fa8bcef978c3c17b0117fa
// parity-case: LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_StandardRegion_Loads256x256::test c4e3a994baf06b0106a6614e9c3efbcc27e45ff1725f5470d2db6ded1fff6014 translated
#[test]
fn load_standard_region_terrain() {
let (loaded, terrain) = invoke_load_terrain("terrains/region.r32", raw_terrain(256, 21.0));
assert!(loaded);
let terrain = terrain.expect("terrain callback");
assert_eq!(terrain.len(), 256);
assert!(terrain.iter().all(|row| row.len() == 256));
assert_eq!(terrain[0][0], 21.0);
}
// Fixture SHA-256: c07500b6f966d65dda9261e3e701fb5bb13e31239ff3a89d74c0046d0ba4ec12
// parity-case: LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_Varregion_Loads512x512::test 4820338f10acbb4987e26992d7a7957be58ab6bc548674bf18943ef312962894 translated
#[test]
fn load_varregion_terrain() {
let (loaded, terrain) = invoke_load_terrain("terrains/megaregion.f32", raw_terrain(512, 30.0));
assert!(loaded);
let terrain = terrain.expect("terrain callback");
assert_eq!(terrain.len(), 512);
assert!(terrain.iter().all(|row| row.len() == 512));
}
// Fixture SHA-256: 2dc88437e482fdaa5613df885d49c2b19bd623ecfc387a72338d2367d4b3b451
// parity-case: LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_WrongByteCount_FailsGracefully::test ff6fb4feb2773c93397d412d0ecf6aef1f3636e823dabb729a7a6cbe94d1513f translated
#[test]
fn reject_terrain_with_wrong_byte_count() {
let (loaded, terrain) =
invoke_load_terrain("terrains/broken.r32", vec![0; 256_usize * 256 * 4 + 3]);
assert!(!loaded);
assert!(terrain.is_none());
}
// Fixture SHA-256: 9b94b83334ada38b48b53f19ef2c45abc9f84fb723564671290a556f75d6fdc8
// parity-case: LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_NonSquarePostCount_FailsGracefully::test 218754e53232cd10318668c70b94ae9d7d541d09598b0490082e023e76d6045f translated
#[test]
fn reject_terrain_with_non_square_post_count() {
let (loaded, terrain) =
invoke_load_terrain("terrains/nonsquare.r32", vec![0; 257_usize * 256 * 4]);
assert!(!loaded);
assert!(terrain.is_none());
}

View File

@@ -5042,7 +5042,7 @@ impl AssetManager {
libremetaverse_types::unimplemented_api!("E:LibreMetaverse.AssetManager.XferReceived") libremetaverse_types::unimplemented_api!("E:LibreMetaverse.AssetManager.XferReceived")
} }
/// C# member: `M:LibreMetaverse.AssetManager.#ctor(LibreMetaverse.GridClient)`. /// C# member: `M:LibreMetaverse.AssetManager.#ctor(LibreMetaverse.GridClient)`.
pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> { pub fn new(client: Option<libremetaverse::GridClient>) -> Result<Self, crate::Error> {
libremetaverse_types::not_implemented( libremetaverse_types::not_implemented(
"M:LibreMetaverse.AssetManager.#ctor(LibreMetaverse.GridClient)", "M:LibreMetaverse.AssetManager.#ctor(LibreMetaverse.GridClient)",
) )
@@ -27523,7 +27523,7 @@ impl TerrainManager {
pub async fn get_terrain_material_overrides( pub async fn get_terrain_material_overrides(
&self, &self,
cancellation_token: Option<libremetaverse_types::compat::CancellationToken>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>,
) -> Result<Option<Vec<libremetaverse::assets::AssetMaterial>>, crate::Error> { ) -> Result<Option<Vec<Option<libremetaverse::assets::AssetMaterial>>>, crate::Error> {
libremetaverse_types::not_implemented( libremetaverse_types::not_implemented(
"M:LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken)", "M:LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken)",
) )
@@ -27531,7 +27531,7 @@ impl TerrainManager {
/// C# member: `M:LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[],System.Threading.CancellationToken)`. /// C# member: `M:LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[],System.Threading.CancellationToken)`.
pub async fn set_terrain_material_overrides( pub async fn set_terrain_material_overrides(
&self, &self,
overrides: Vec<libremetaverse::assets::AssetMaterial>, overrides: Vec<Option<libremetaverse::assets::AssetMaterial>>,
cancellation_token: Option<libremetaverse_types::compat::CancellationToken>, cancellation_token: Option<libremetaverse_types::compat::CancellationToken>,
) -> Result<bool, crate::Error> { ) -> Result<bool, crate::Error> {
libremetaverse_types::not_implemented( libremetaverse_types::not_implemented(
@@ -29804,7 +29804,7 @@ pub mod assets {
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.ApplyOverride(LibreMetaverse.Assets.AssetMaterial)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.ApplyOverride(LibreMetaverse.Assets.AssetMaterial)`.
pub fn apply_override( pub fn apply_override(
&self, &mut self,
override_mat: libremetaverse::assets::AssetMaterial, override_mat: libremetaverse::assets::AssetMaterial,
) -> Result<(), crate::Error> { ) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented( libremetaverse_types::not_implemented(
@@ -29812,11 +29812,11 @@ pub mod assets {
) )
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.Decode`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.Decode`.
pub fn decode(&self) -> Result<bool, crate::Error> { pub fn decode(&mut self) -> Result<bool, crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Assets.AssetMaterial.Decode") libremetaverse_types::not_implemented("M:LibreMetaverse.Assets.AssetMaterial.Decode")
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.Encode`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.Encode`.
pub fn encode(&self) -> Result<(), crate::Error> { pub fn encode(&mut self) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented("M:LibreMetaverse.Assets.AssetMaterial.Encode") libremetaverse_types::not_implemented("M:LibreMetaverse.Assets.AssetMaterial.Encode")
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.FromOverrideOsd(LibreMetaverse.StructuredData.OSDMap)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.FromOverrideOsd(LibreMetaverse.StructuredData.OSDMap)`.
@@ -29829,7 +29829,7 @@ pub mod assets {
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetAlphaCutoff(System.Single,System.Boolean)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetAlphaCutoff(System.Single,System.Boolean)`.
pub fn set_alpha_cutoff_with_single_boolean( pub fn set_alpha_cutoff_with_single_boolean(
&self, &mut self,
cutoff: f32, cutoff: f32,
for_override: Option<bool>, for_override: Option<bool>,
) -> Result<(), crate::Error> { ) -> Result<(), crate::Error> {
@@ -29839,7 +29839,7 @@ pub mod assets {
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetAlphaMode(LibreMetaverse.Assets.GltfAlphaMode,System.Boolean)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetAlphaMode(LibreMetaverse.Assets.GltfAlphaMode,System.Boolean)`.
pub fn set_alpha_mode_with_gltf_alpha_mode_boolean( pub fn set_alpha_mode_with_gltf_alpha_mode_boolean(
&self, &mut self,
mode: libremetaverse::assets::GltfAlphaMode, mode: libremetaverse::assets::GltfAlphaMode,
for_override: Option<bool>, for_override: Option<bool>,
) -> Result<(), crate::Error> { ) -> Result<(), crate::Error> {
@@ -29849,7 +29849,7 @@ pub mod assets {
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetBaseColorFactor(LibreMetaverse.Color4,System.Boolean)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetBaseColorFactor(LibreMetaverse.Color4,System.Boolean)`.
pub fn set_base_color_factor_with_color4_boolean( pub fn set_base_color_factor_with_color4_boolean(
&self, &mut self,
color: libremetaverse_types::Color4, color: libremetaverse_types::Color4,
for_override: Option<bool>, for_override: Option<bool>,
) -> Result<(), crate::Error> { ) -> Result<(), crate::Error> {
@@ -29858,14 +29858,14 @@ pub mod assets {
) )
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetBaseMaterial`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetBaseMaterial`.
pub fn set_base_material(&self) -> Result<(), crate::Error> { pub fn set_base_material(&mut self) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented( libremetaverse_types::not_implemented(
"M:LibreMetaverse.Assets.AssetMaterial.SetBaseMaterial", "M:LibreMetaverse.Assets.AssetMaterial.SetBaseMaterial",
) )
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetDoubleSided(System.Boolean,System.Boolean)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetDoubleSided(System.Boolean,System.Boolean)`.
pub fn set_double_sided_with_boolean_boolean( pub fn set_double_sided_with_boolean_boolean(
&self, &mut self,
double_sided: bool, double_sided: bool,
for_override: Option<bool>, for_override: Option<bool>,
) -> Result<(), crate::Error> { ) -> Result<(), crate::Error> {
@@ -29875,7 +29875,7 @@ pub mod assets {
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetEmissiveFactor(LibreMetaverse.Vector3,System.Boolean)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetEmissiveFactor(LibreMetaverse.Vector3,System.Boolean)`.
pub fn set_emissive_factor_with_vector3_boolean( pub fn set_emissive_factor_with_vector3_boolean(
&self, &mut self,
color: libremetaverse_types::Vector3, color: libremetaverse_types::Vector3,
for_override: Option<bool>, for_override: Option<bool>,
) -> Result<(), crate::Error> { ) -> Result<(), crate::Error> {
@@ -29885,7 +29885,7 @@ pub mod assets {
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetMetallicFactor(System.Single,System.Boolean)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetMetallicFactor(System.Single,System.Boolean)`.
pub fn set_metallic_factor_with_single_boolean( pub fn set_metallic_factor_with_single_boolean(
&self, &mut self,
metallic: f32, metallic: f32,
for_override: Option<bool>, for_override: Option<bool>,
) -> Result<(), crate::Error> { ) -> Result<(), crate::Error> {
@@ -29895,7 +29895,7 @@ pub mod assets {
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetRoughnessFactor(System.Single,System.Boolean)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetRoughnessFactor(System.Single,System.Boolean)`.
pub fn set_roughness_factor_with_single_boolean( pub fn set_roughness_factor_with_single_boolean(
&self, &mut self,
roughness: f32, roughness: f32,
for_override: Option<bool>, for_override: Option<bool>,
) -> Result<(), crate::Error> { ) -> Result<(), crate::Error> {
@@ -29905,7 +29905,7 @@ pub mod assets {
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureId(System.Int32,LibreMetaverse.UUID,System.Boolean)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureId(System.Int32,LibreMetaverse.UUID,System.Boolean)`.
pub fn set_texture_id( pub fn set_texture_id(
&self, &mut self,
slot: i32, slot: i32,
id: libremetaverse_types::UUID, id: libremetaverse_types::UUID,
for_override: Option<bool>, for_override: Option<bool>,
@@ -29916,7 +29916,7 @@ pub mod assets {
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureOffset(System.Int32,LibreMetaverse.Vector2)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureOffset(System.Int32,LibreMetaverse.Vector2)`.
pub fn set_texture_offset( pub fn set_texture_offset(
&self, &mut self,
slot: i32, slot: i32,
offset: libremetaverse_types::Vector2, offset: libremetaverse_types::Vector2,
) -> Result<(), crate::Error> { ) -> Result<(), crate::Error> {
@@ -29925,14 +29925,18 @@ pub mod assets {
) )
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureRotation(System.Int32,System.Single)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureRotation(System.Int32,System.Single)`.
pub fn set_texture_rotation(&self, slot: i32, rotation: f32) -> Result<(), crate::Error> { pub fn set_texture_rotation(
&mut self,
slot: i32,
rotation: f32,
) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented( libremetaverse_types::not_implemented(
"M:LibreMetaverse.Assets.AssetMaterial.SetTextureRotation(System.Int32,System.Single)", "M:LibreMetaverse.Assets.AssetMaterial.SetTextureRotation(System.Int32,System.Single)",
) )
} }
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureScale(System.Int32,LibreMetaverse.Vector2)`. /// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureScale(System.Int32,LibreMetaverse.Vector2)`.
pub fn set_texture_scale( pub fn set_texture_scale(
&self, &mut self,
slot: i32, slot: i32,
scale: libremetaverse_types::Vector2, scale: libremetaverse_types::Vector2,
) -> Result<(), crate::Error> { ) -> Result<(), crate::Error> {

View File

@@ -4,6 +4,9 @@ extern crate self as libremetaverse;
mod generated; mod generated;
#[cfg(test)]
mod asset_archive_semantics;
pub use generated::*; pub use generated::*;
pub use libremetaverse_imaging as imaging_abstractions; pub use libremetaverse_imaging as imaging_abstractions;
pub use libremetaverse_structured_data as structured_data; pub use libremetaverse_structured_data as structured_data;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,697 @@
#![allow(
clippy::float_cmp,
clippy::needless_pass_by_value,
clippy::too_many_lines
)]
// Exact BSD-3-Clause fixture provenance at LibreMetaverse
// 2aa70bb68513b39795da5d13c88f31b86e85a3ba (see LICENSE.md):
// GLTFMaterialOverrideCapTests.cs 4d717ded7cc7bd4e68210417f722a1ceec6391b19dc3b1dfeb558ae16e6f115b
// GLTFMaterialUploadTests.cs 0602d1504e405868d7bcb608eb7c0db9f47e9ec6636846f34d48669aa5a27025
// TerrainMaterialOverrideTests.cs b9409ba65906e2b9d30d42b350b4b3e9c1655d4a503c4ff87bd548dd229dad88
// SendPostcardTests.cs 56691373dfa8f817f0b1079b8ec40f16e0186d6cfb13f772da0ffe3935188b4d
// UploadThumbnailTests.cs 8a88c5e4d45e7e1d4f8a41092528eefee347c7bd5f5e6f3af171ac19455e894b
// ConstructorNullArgumentTests.cs 28deea0bf4d9353a2424842c6184abab8fe82746ceb12e093912728a247f21bc
use libremetaverse::assets::AssetMaterial;
use libremetaverse::{AssetManager, GLTFMaterialUpdate, GridClient, HttpCapsClient};
use libremetaverse_compat_tests::block_on;
use libremetaverse_types::compat::{HttpMessageHandler, HttpRequest, HttpResponse, Uri};
use libremetaverse_types::{Color4, Error, UUID, Vector3};
use std::collections::{BTreeMap, HashMap, VecDeque};
use std::sync::{Arc, Mutex};
const MODIFY_MATERIAL: &str = "http://test.invalid/modify-material-params";
const MATERIAL_AGENT: &str = "http://test.invalid/update-material-agent-inventory";
const MATERIAL_TASK: &str = "http://test.invalid/update-material-task-inventory";
const MATERIAL_UPLOADER: &str = "http://test.invalid/update-material/upload/abc123";
const MODIFY_REGION: &str = "http://test.invalid/modify-region";
const POSTCARD: &str = "http://test.invalid/send-postcard";
const POSTCARD_UPLOADER: &str = "http://test.invalid/send-postcard/upload/abc123";
const THUMBNAIL: &str = "http://test.invalid/inventory-thumbnail-upload";
const THUMBNAIL_UPLOADER: &str = "http://test.invalid/inventory-thumbnail-upload/upload/abc123";
#[derive(Clone)]
struct RecordingHttp {
requests: Arc<Mutex<Vec<HttpRequest>>>,
}
impl RecordingHttp {
fn new(responses: &[(&str, &str)]) -> (Self, HttpMessageHandler) {
let requests = Arc::new(Mutex::new(Vec::new()));
let recorded = Arc::clone(&requests);
let mut queued = HashMap::<String, VecDeque<HttpResponse>>::new();
for (uri, body) in responses {
queued
.entry((*uri).into())
.or_default()
.push_back(response(body));
}
let queued = Mutex::new(queued);
let handler = HttpMessageHandler::new(move |request| {
let uri = request.uri.0.clone();
recorded.lock().expect("request recording").push(request);
queued
.lock()
.expect("response queue")
.get_mut(&uri)
.and_then(VecDeque::pop_front)
.unwrap_or_else(|| HttpResponse {
status_code: 404,
headers: BTreeMap::new(),
content_type: None,
body: Vec::new(),
})
});
(Self { requests }, handler)
}
fn requests(&self) -> Vec<HttpRequest> {
self.requests.lock().expect("request recording").clone()
}
}
fn response(body: &str) -> HttpResponse {
HttpResponse {
status_code: 200,
headers: BTreeMap::from([("Content-Length".into(), body.len().to_string())]),
content_type: Some("application/json".into()),
body: body.as_bytes().to_vec(),
}
}
fn client_with_responses(responses: &[(&str, &str)]) -> (GridClient, RecordingHttp) {
let (recording, handler) = RecordingHttp::new(responses);
let mut client = GridClient::new().expect("GridClient constructor");
client.set_http_caps_client(HttpCapsClient::new(handler).expect("HttpCapsClient constructor"));
(client, recording)
}
fn current_sim(client: &GridClient) -> libremetaverse::Simulator {
client
.network()
.current_sim()
.expect("fixture current simulator")
}
fn body(request: &HttpRequest) -> String {
String::from_utf8(request.body.clone()).expect("UTF-8 request body")
}
fn uuid_eq(actual: &UUID, expected: &UUID) {
assert_eq!(
actual.get_bytes().expect("actual UUID bytes"),
expected.get_bytes().expect("expected UUID bytes")
);
}
fn assert_error<T>(result: Result<T, Error>, expected: Error) {
match result {
Err(Error::NotImplemented(error)) => panic!(
"expected {expected:?}, got failure-only shim {}",
error.csharp_member()
),
Err(error) => assert_eq!(error, expected),
Ok(_) => panic!("expected {expected:?}, got success"),
}
}
fn happy_upload_responses<'a>(
capability: &'a str,
uploader: &'a str,
new_asset: &UUID,
) -> [(&'a str, String); 2] {
[
(
capability,
format!(r#"{{"state":"upload","uploader":"{uploader}"}}"#),
),
(
uploader,
format!(
r#"{{"state":"complete","new_asset":"{}"}}"#,
new_asset.to_string()
),
),
]
}
fn response_refs<'a, const N: usize>(
responses: &'a [(&'a str, String); N],
) -> Vec<(&'a str, &'a str)> {
responses
.iter()
.map(|(uri, body)| (*uri, body.as_str()))
.collect()
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SetMaterialOverrideAsync_HappyPath_PostsBareArrayWithGltfJson::test 0c51b7b793111f5433e52057f26fa5a98d983e7230fefeb61a7b3408e97f28ee translated
#[test]
fn set_material_override_posts_bare_array_with_gltf_json() {
let (client, recording) = client_with_responses(&[(MODIFY_MATERIAL, r#"{"success":true}"#)]);
let object_id = UUID::random().expect("UUID Random");
let expected_id = object_id.to_string();
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
material
.set_base_color_factor_with_color4_boolean(
Color4::new_with_single_single_single_single(0.1, 0.2, 0.3, 1.0)
.expect("Color4 constructor"),
Some(true),
)
.expect("SetBaseColorFactor");
let result = block_on(client.objects().set_material_override(
current_sim(&client),
object_id,
3,
material,
None,
))
.expect("SetMaterialOverrideAsync");
assert!(result);
let requests = recording.requests();
assert_eq!(requests.len(), 1);
let body = body(&requests[0]);
assert!(body.contains("<key>object_id</key>"));
assert!(body.contains(&expected_id));
assert!(body.contains("<key>side</key>"));
assert!(body.contains("<key>gltf_json</key>"));
assert!(!body.contains("<key>asset_id</key>"));
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.ClearMaterialOverrideAsync_SendsEmptyGltfJson::test 8394d063ea71447d9ce2b76fd00be1d10967f9193e1eb909c5b9f2da56eec812 translated
#[test]
fn clear_material_override_sends_empty_gltf_json() {
let (client, recording) = client_with_responses(&[(MODIFY_MATERIAL, r#"{"success":true}"#)]);
assert!(
block_on(client.objects().clear_material_override(
current_sim(&client),
UUID::random().expect("UUID Random"),
0,
None,
))
.expect("ClearMaterialOverrideAsync")
);
let body = body(&recording.requests()[0]);
assert!(body.contains("<key>gltf_json</key>"));
assert!(body.contains("<string />") || body.contains("<string></string>"));
assert!(!body.contains("<key>asset_id</key>"));
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.ApplyMaterialAsync_WithoutOverride_SendsAssetIdOnly::test 1db03ab6710ecf532644398d1fef5e82520e1206058d66fb15c8885fdc8f8363 translated
#[test]
fn apply_material_without_override_sends_asset_id_only() {
let (client, recording) = client_with_responses(&[(MODIFY_MATERIAL, r#"{"success":true}"#)]);
let asset_id = UUID::random().expect("UUID Random");
let expected_id = asset_id.to_string();
assert!(
block_on(client.objects().apply_material(
current_sim(&client),
UUID::random().expect("UUID Random"),
1,
asset_id,
None,
None,
))
.expect("ApplyMaterialAsync")
);
let body = body(&recording.requests()[0]);
assert!(body.contains("<key>asset_id</key>"));
assert!(body.contains(&expected_id));
assert!(!body.contains("<key>gltf_json</key>"));
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_MultipleEntries_SendsSingleArrayBody::test 621dca88e7f1c9e024563204ca05c3c8d9a03c4b5a7b31ec1c006abe6732b47b translated
#[test]
fn material_updates_send_one_array_body() {
let (client, recording) = client_with_responses(&[(MODIFY_MATERIAL, r#"{"success":true}"#)]);
let mut first = GLTFMaterialUpdate::new().expect("GLTFMaterialUpdate constructor");
first.set_object_id(UUID::random().expect("UUID Random"));
first.set_side(0);
let mut second = GLTFMaterialUpdate::new().expect("GLTFMaterialUpdate constructor");
second.set_object_id(UUID::random().expect("UUID Random"));
second.set_side(1);
second.set_asset_id(Some(Some(UUID::random().expect("UUID Random"))));
assert!(
block_on(client.objects().send_material_updates(
current_sim(&client),
Box::new(vec![first, second].into_iter()),
None,
))
.expect("SendMaterialUpdatesAsync")
);
assert_eq!(recording.requests().len(), 1);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_ServerRejects_ReturnsFalse::test e9fbd95fff84695e2cb1a35943bda768f00cf9015b25e0ae1505dce4dde603a4 translated
#[test]
fn material_updates_server_rejection_returns_false() {
let (client, _) = client_with_responses(&[(
MODIFY_MATERIAL,
r#"{"success":false,"message":"no rez rights"}"#,
)]);
assert!(
!block_on(client.objects().clear_material_override(
current_sim(&client),
UUID::random().expect("UUID Random"),
0,
None,
))
.expect("ClearMaterialOverrideAsync")
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_NoCapability_ReturnsFalseWithoutRequest::test fdceb6bf865cb23386a6b82a9741f230e5c22b0ec6d37bc2ac8478f29292a49f translated
#[test]
fn material_updates_without_capability_make_no_request() {
let (client, recording) = client_with_responses(&[]);
assert!(
!block_on(client.objects().clear_material_override(
current_sim(&client),
UUID::random().expect("UUID Random"),
0,
None,
))
.expect("ClearMaterialOverrideAsync")
);
assert!(recording.requests().is_empty());
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_HappyPath_PostsMetadataThenJsonAndReturnsNewAsset::test 5ac0e3c27fa6ebfddc9d7582aefb0684a676413948b055382c43b1b0b1cd7e7e translated
#[test]
fn material_agent_upload_posts_metadata_then_json() {
let item_id = UUID::random().expect("UUID Random");
let new_asset = UUID::random().expect("UUID Random");
let responses = happy_upload_responses(MATERIAL_AGENT, MATERIAL_UPLOADER, &new_asset);
let refs = response_refs(&responses);
let (client, recording) = client_with_responses(&refs);
let result = block_on(client.inventory().request_update_material_agent_inventory(
AssetMaterial::new_with_constructor().expect("AssetMaterial constructor"),
item_id,
None,
None,
))
.expect("RequestUpdateMaterialAgentInventoryAsync");
assert!(result.0);
uuid_eq(&result.2, &new_asset);
let requests = recording.requests();
assert_eq!(requests.len(), 2);
let metadata = body(&requests[0]);
assert!(metadata.contains("<key>item_id</key>"));
assert!(!metadata.contains("<key>task_id</key>"));
assert_eq!(requests[1].uri, Uri(MATERIAL_UPLOADER.into()));
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialTaskInventoryAsync_HappyPath_PostsItemIdAndTaskId::test 7ac0e7d210b1aefa795e479f4da0d2dd4caae0b3bbe84ca124707c3ae005bbbd translated
#[test]
fn material_task_upload_posts_item_and_task_ids() {
let new_asset = UUID::random().expect("UUID Random");
let responses = happy_upload_responses(MATERIAL_TASK, MATERIAL_UPLOADER, &new_asset);
let refs = response_refs(&responses);
let (client, recording) = client_with_responses(&refs);
let result = block_on(client.inventory().request_update_material_task_inventory(
AssetMaterial::new_with_constructor().expect("AssetMaterial constructor"),
UUID::random().expect("UUID Random"),
UUID::random().expect("UUID Random"),
None,
None,
))
.expect("RequestUpdateMaterialTaskInventoryAsync");
assert!(result.0);
uuid_eq(&result.2, &new_asset);
let metadata = body(&recording.requests()[0]);
assert!(metadata.contains("<key>item_id</key>"));
assert!(metadata.contains("<key>task_id</key>"));
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_NoCapability_Throws::test 325269807d778264e571d1518ca9a2ca69a27ba67ad689e580f2636ab595f335 translated
#[test]
fn material_agent_upload_without_capability_is_invalid_operation() {
let (client, _) = client_with_responses(&[]);
assert_error(
block_on(client.inventory().request_update_material_agent_inventory(
AssetMaterial::new_with_constructor().expect("AssetMaterial constructor"),
UUID::random().expect("UUID Random"),
None,
None,
)),
Error::InvalidOperation,
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_UploadedJsonRoundTripsMaterial::test fd059dfc8c9299c3b6583b3b47ba18ae9c92e3ad923f88634019b0ab9f34d401 translated
#[test]
fn uploaded_material_json_round_trips() {
let new_asset = UUID::random().expect("UUID Random");
let responses = happy_upload_responses(MATERIAL_AGENT, MATERIAL_UPLOADER, &new_asset);
let refs = response_refs(&responses);
let (client, recording) = client_with_responses(&refs);
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
material.set_name("My Material".into());
material
.set_base_color_factor_with_color4_boolean(
Color4::new_with_single_single_single_single(0.2, 0.4, 0.6, 1.0)
.expect("Color4 constructor"),
None,
)
.expect("SetBaseColorFactor");
block_on(client.inventory().request_update_material_agent_inventory(
material,
UUID::random().expect("UUID Random"),
None,
None,
))
.expect("RequestUpdateMaterialAgentInventoryAsync");
let uploaded = recording.requests()[1].body.clone();
let round_trip =
AssetMaterial::new_with_uuid_bytes(UUID::random().expect("UUID Random"), uploaded)
.expect("AssetMaterial JSON constructor");
assert_eq!(round_trip.name(), "My Material");
assert_eq!(
[
round_trip.base_color_factor().r,
round_trip.base_color_factor().g,
round_trip.base_color_factor().b,
round_trip.base_color_factor().a,
],
[0.2, 0.4, 0.6, 1.0]
);
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_ParsesFourSlotsWithSomeEmpty::test 0b7f2b5a7a95c70f4ed97b9b028f3ec16f1cd427a9d4d1b133523bd331f6b9f2 translated
#[test]
fn terrain_get_parses_four_slots_with_empty_entries() {
let (client, _) = client_with_responses(&[(
MODIFY_REGION,
r#"{"success":true,"overrides":[{},{"mf":0.25},{},{}]}"#,
)]);
let overrides = block_on(client.terrain().get_terrain_material_overrides(None))
.expect("GetTerrainMaterialOverridesAsync")
.expect("successful override response");
assert_eq!(overrides.len(), 4);
assert!(overrides[0].is_none());
assert_eq!(
overrides[1].as_ref().expect("slot one").metallic_factor(),
0.25
);
assert!(overrides[2].is_none());
assert!(overrides[3].is_none());
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_ServerReportsFailure_ReturnsNull::test c66b84662333288b7328822d1f9fa79450075d44a1178a9b0b661671072efe5b translated
#[test]
fn terrain_get_server_failure_returns_none() {
let (client, _) =
client_with_responses(&[(MODIFY_REGION, r#"{"success":false,"message":"nope"}"#)]);
assert!(
block_on(client.terrain().get_terrain_material_overrides(None))
.expect("GetTerrainMaterialOverridesAsync")
.is_none()
);
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_NoCapability_ReturnsNullWithoutRequest::test 677f80689e1b6a67893d100e1116805fb9f63c5b6ec33e64a4dc9a4cf24c1237 translated
#[test]
fn terrain_get_without_capability_makes_no_request() {
let (client, recording) = client_with_responses(&[]);
assert!(
block_on(client.terrain().get_terrain_material_overrides(None))
.expect("GetTerrainMaterialOverridesAsync")
.is_none()
);
assert!(recording.requests().is_empty());
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_MixOfNullAndSet_PostsFourEntries::test a4ce031e565ca7eb1864064d299dbf0c7b715581ce330a57be9c3aa93987e67c translated
#[test]
fn terrain_set_posts_four_mixed_entries() {
let (client, recording) = client_with_responses(&[(MODIFY_REGION, r#"{"success":true}"#)]);
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
material
.set_roughness_factor_with_single_boolean(0.1, Some(true))
.expect("SetRoughnessFactor");
assert!(
block_on(
client
.terrain()
.set_terrain_material_overrides(vec![None, Some(material), None, None], None,)
)
.expect("SetTerrainMaterialOverridesAsync")
);
let body = body(&recording.requests()[0]);
assert!(body.contains("<key>overrides</key>"));
assert!(body.contains("<key>rf</key>"));
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_WrongLength_Throws::test 836099a369b37555049b1c1ddfb9562c57cdef88381b7a79e8b80fe62b169a44 translated
#[test]
fn terrain_set_wrong_length_is_argument_error() {
let (client, _) = client_with_responses(&[]);
assert_error(
block_on(
client
.terrain()
.set_terrain_material_overrides(vec![None, None], None),
),
Error::Argument,
);
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_NoCapability_ReturnsFalseWithoutRequest::test 37948cbc0240910d63782d88c0fb9f1d239215cea34a5aa84ac68a10d0555e87 translated
#[test]
fn terrain_set_without_capability_makes_no_request() {
let (client, recording) = client_with_responses(&[]);
assert!(
!block_on(
client
.terrain()
.set_terrain_material_overrides(vec![None, None, None, None], None,)
)
.expect("SetTerrainMaterialOverridesAsync")
);
assert!(recording.requests().is_empty());
}
// parity-case: LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_HappyPath_PostsMetadataThenImageAndReturnsTrue::test 2e02bd16ef1431c2ca82d7804dffc764be0175cff5daff8c38d0a61641439e06 translated
#[test]
fn postcard_posts_metadata_then_image() {
let (client, recording) = client_with_responses(&[
(
POSTCARD,
r#"{"state":"upload","uploader":"http://test.invalid/send-postcard/upload/abc123"}"#,
),
(POSTCARD_UPLOADER, r#"{"state":"complete"}"#),
]);
assert!(
block_on(client.self_().send_postcard(
vec![0xff, 0xd8, 0xff, 0xd9],
"friend@example.com".into(),
"Jim Radford".into(),
"Postcard from the edge".into(),
"Hello, how are you today?".into(),
Vector3::one(),
None,
))
.expect("SendPostcardAsync")
);
let requests = recording.requests();
assert_eq!(requests.len(), 2);
assert_eq!(requests[0].method, "POST");
assert_eq!(requests[0].uri, Uri(POSTCARD.into()));
let metadata = body(&requests[0]);
assert!(!metadata.contains("<key>from</key>"));
for field in ["to", "name", "subject", "msg", "pos-global"] {
assert!(metadata.contains(field));
}
assert_eq!(requests[1].method, "POST");
assert_eq!(requests[1].uri, Uri(POSTCARD_UPLOADER.into()));
}
// parity-case: LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_UploaderMissingFromResponse_ReturnsFalseWithoutSecondRequest::test 2f9498d57d7a512399f9b108765e6e8da8e4c937402f9671d580c66332630432 translated
#[test]
fn postcard_missing_uploader_returns_false_after_one_request() {
let (client, recording) = client_with_responses(&[(POSTCARD, r#"{"state":"upload"}"#)]);
assert!(
!block_on(client.self_().send_postcard(
vec![1, 2, 3],
"friend@example.com".into(),
"Jim Radford".into(),
"Subject".into(),
"Message".into(),
Vector3::zero(),
None,
))
.expect("SendPostcardAsync")
);
assert_eq!(recording.requests().len(), 1);
}
// parity-case: LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_UploadDoesNotComplete_ReturnsFalse::test 937b682b406506ec9fba9570852bbf8689450a11cbecb85979af97609b1794f9 translated
#[test]
fn postcard_incomplete_upload_returns_false() {
let (client, _) = client_with_responses(&[
(
POSTCARD,
r#"{"state":"upload","uploader":"http://test.invalid/send-postcard/upload/abc123"}"#,
),
(POSTCARD_UPLOADER, r#"{"state":"failed"}"#),
]);
assert!(
!block_on(client.self_().send_postcard(
vec![1, 2, 3],
"friend@example.com".into(),
"Jim Radford".into(),
"Subject".into(),
"Message".into(),
Vector3::zero(),
None,
))
.expect("SendPostcardAsync")
);
}
// parity-case: LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_NoCapability_ReturnsFalseWithoutRequest::test 8d3ef84e873096d9388bb7db3eaeeb79c661fd9951e338f71bbf3251ae6580e8 translated
#[test]
fn postcard_without_capability_makes_no_request() {
let (client, recording) = client_with_responses(&[]);
assert!(
!block_on(client.self_().send_postcard(
vec![1, 2, 3],
"friend@example.com".into(),
"Jim Radford".into(),
"Subject".into(),
"Message".into(),
Vector3::zero(),
None,
))
.expect("SendPostcardAsync")
);
assert!(recording.requests().is_empty());
}
fn thumbnail_responses(new_asset: &UUID) -> [(&str, String); 2] {
[
(
THUMBNAIL,
format!(r#"{{"uploader":"{THUMBNAIL_UPLOADER}"}}"#),
),
(
THUMBNAIL_UPLOADER,
format!(
r#"{{"state":"complete","new_asset":"{}"}}"#,
new_asset.to_string()
),
),
]
}
fn upload_thumbnail(client: &GridClient, inventory_id: UUID, task_id: UUID) -> Option<UUID> {
block_on(
client
.inventory()
.upload_thumbnail(inventory_id, task_id, vec![1, 2, 3], None, None),
)
.expect("UploadThumbnailAsync")
.flatten()
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_AgentInventoryItem_SendsBareItemIdAndReturnsNewAsset::test 40ca874a37dade3bfbb391a2b4a75c684cfd7509b269286ccc14d747340d095d translated
#[test]
fn thumbnail_agent_item_sends_bare_item_id() {
let new_asset = UUID::random().expect("UUID Random");
let responses = thumbnail_responses(&new_asset);
let refs = response_refs(&responses);
let (client, recording) = client_with_responses(&refs);
let result = upload_thumbnail(&client, UUID::random().expect("UUID Random"), UUID::zero())
.expect("new thumbnail asset");
uuid_eq(&result, &new_asset);
let requests = recording.requests();
assert_eq!(requests.len(), 2);
let metadata = body(&requests[0]);
assert!(metadata.contains("<key>item_id</key>"));
assert!(!metadata.contains("<key>task_id</key>"));
assert!(!metadata.contains("<key>category_id</key>"));
assert_eq!(requests[1].uri, Uri(THUMBNAIL_UPLOADER.into()));
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_TaskInventoryItem_SendsItemIdAndTaskId::test dae80f9a7ba6222a651165f779c123d8472f88a17490e69a1112acc3cec6d108 translated
#[test]
fn thumbnail_task_item_sends_item_and_task_ids() {
let new_asset = UUID::random().expect("UUID Random");
let responses = thumbnail_responses(&new_asset);
let refs = response_refs(&responses);
let (client, recording) = client_with_responses(&refs);
let result = upload_thumbnail(
&client,
UUID::random().expect("UUID Random"),
UUID::random().expect("UUID Random"),
)
.expect("new thumbnail asset");
uuid_eq(&result, &new_asset);
let metadata = body(&recording.requests()[0]);
assert!(metadata.contains("<key>item_id</key>"));
assert!(metadata.contains("<key>task_id</key>"));
assert!(!metadata.contains("<key>category_id</key>"));
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_KnownLocalFolder_SendsCategoryId::test 1ccca44bbead54fd5041c41fc6560478ba17f9e5d9bacff21096b254d2f526db translated
#[test]
fn thumbnail_known_local_folder_sends_category_id() {
let folder_id = UUID::random().expect("UUID Random");
let new_asset = UUID::random().expect("UUID Random");
let responses = thumbnail_responses(&new_asset);
let refs = response_refs(&responses);
let (client, recording) = client_with_responses(&refs);
// Upstream's helper labels this ID "Test Folder" through a private
// InventoryStore field. Rust keeps the operation and observation public:
// UploadThumbnailAsync must classify this known folder as category_id.
let result = upload_thumbnail(&client, folder_id, UUID::zero()).expect("new thumbnail asset");
uuid_eq(&result, &new_asset);
let metadata = body(&recording.requests()[0]);
assert!(metadata.contains("<key>category_id</key>"));
assert!(!metadata.contains("<key>item_id</key>"));
assert!(!metadata.contains("<key>task_id</key>"));
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_NoCapability_ReturnsNullWithoutRequest::test 2bc1ad18b159c5d62a18d2208ed3cf3c88d3f666a0e0dad8730778cd22b59eda translated
#[test]
fn thumbnail_without_capability_makes_no_request() {
let (client, recording) = client_with_responses(&[]);
assert!(
upload_thumbnail(&client, UUID::random().expect("UUID Random"), UUID::zero(),).is_none()
);
assert!(recording.requests().is_empty());
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_MetadataResponseMissingUploader_ReturnsNullWithoutSecondRequest::test 8db3eddf1204ad795e9d5ef15365f422f96191a8b4c24ef3393b03c10d92d662 translated
#[test]
fn thumbnail_missing_uploader_returns_none_after_one_request() {
let (client, recording) = client_with_responses(&[(THUMBNAIL, r#"{"state":"upload"}"#)]);
assert!(
upload_thumbnail(&client, UUID::random().expect("UUID Random"), UUID::zero(),).is_none()
);
assert_eq!(recording.requests().len(), 1);
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_UploadDoesNotComplete_ReturnsNull::test e870f6913e3f45676ce490069930427e6c625072fc1d6ebbf16f503be51df4ae translated
#[test]
fn thumbnail_incomplete_upload_returns_none() {
let (client, _) = client_with_responses(&[
(
THUMBNAIL,
r#"{"uploader":"http://test.invalid/inventory-thumbnail-upload/upload/abc123"}"#,
),
(
THUMBNAIL_UPLOADER,
r#"{"state":"failed","message":"bad image"}"#,
),
]);
assert!(
upload_thumbnail(&client, UUID::random().expect("UUID Random"), UUID::zero(),).is_none()
);
}
// parity-case: LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.AssetManager_Null_Throws::test 4fa1be8b233dacf6a5955359f2197ff77ae85ffbf2c3c68fcd8cbe672c2c5f91 translated
#[test]
fn asset_manager_none_client_is_argument_null() {
assert_error(AssetManager::new(None), Error::ArgumentNull);
}

View File

@@ -0,0 +1,516 @@
#![allow(clippy::float_cmp)]
// Exact BSD-3-Clause fixture provenance at LibreMetaverse
// 2aa70bb68513b39795da5d13c88f31b86e85a3ba (see LICENSE.md):
// AssetMaterialOverrideTests.cs 3ec3a8bca08da06c52de1eeea1428b2b83c27660af20580f0333ed67b01bd09b
// GltfDocumentTests.cs e6e94d5b97a27b8cc4a345f08ab9a9a43b6ce587667edd89d8a4ebbc04eaa646
// Embedded 44-byte triangle buffer d3478e66e380d8a2b0c9d80f3459f75660efb111e7b801a7d1c1f8f48723d79b
use libremetaverse::assets::gltf::{GltfDocument, GltfPrimitive, GltfPrimitiveMode};
use libremetaverse::assets::{AssetMaterial, GltfAlphaMode};
use libremetaverse_structured_data::OSDMap;
use libremetaverse_types::{Color4, Quaternion, UUID, Vector2, Vector3};
fn color(r: f32, g: f32, b: f32, a: f32) -> Color4 {
Color4::new_with_single_single_single_single(r, g, b, a).expect("Color4 constructor")
}
fn vector2(x: f32, y: f32) -> Vector2 {
Vector2::new_with_single_single(x, y).expect("Vector2 constructor")
}
fn color_values(value: &Color4) -> [f32; 4] {
[value.r, value.g, value.b, value.a]
}
fn vector2_values(value: &Vector2) -> [f32; 2] {
[value.x, value.y]
}
fn vector3_values(value: &Vector3) -> [f32; 3] {
[value.x, value.y, value.z]
}
fn quaternion_values(value: &Quaternion) -> [f32; 4] {
[value.x, value.y, value.z, value.w]
}
fn uuid_eq(actual: &UUID, expected: &UUID) {
assert_eq!(
actual.get_bytes().expect("actual UUID bytes"),
expected.get_bytes().expect("expected UUID bytes")
);
}
fn minimal_gltf_json() -> String {
r#"{
"asset": { "version": "2.0", "generator": "Test" },
"scene": 0,
"scenes": [{ "name": "Scene", "nodes": [0] }],
"nodes": [{ "name": "Mesh", "mesh": 0 }],
"meshes": [{
"name": "Triangle",
"primitives": [{
"attributes": { "POSITION": 0 },
"indices": 1,
"material": 0,
"mode": 4
}]
}],
"materials": [{
"name": "Mat",
"pbrMetallicRoughness": {
"baseColorFactor": [1.0, 0.5, 0.0, 1.0],
"metallicFactor": 0.0,
"roughnessFactor": 1.0
},
"alphaMode": "OPAQUE",
"alphaCutoff": 0.5,
"doubleSided": false
}],
"accessors": [
{
"bufferView": 0,
"byteOffset": 0,
"componentType": 5126,
"count": 3,
"type": "VEC3",
"max": [1.0, 1.0, 0.0],
"min": [0.0, 0.0, 0.0]
},
{
"bufferView": 1,
"byteOffset": 0,
"componentType": 5123,
"count": 3,
"type": "SCALAR"
}
],
"bufferViews": [
{ "buffer": 0, "byteOffset": 0, "byteLength": 36, "target": 34962 },
{ "buffer": 0, "byteOffset": 36, "byteLength": 6, "target": 34963 }
],
"buffers": [{
"byteLength": 44,
"uri": "data:application/octet-stream;base64,AAAAAAAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAABAAIAAAA="
}]
}"#
.into()
}
fn load_document() -> GltfDocument {
GltfDocument::load_gltf(minimal_gltf_json(), None).expect("GltfDocument LoadGltf")
}
fn first_primitive(document: &GltfDocument) -> GltfPrimitive {
document.meshes()[0]
.primitives()
.into_iter()
.next()
.expect("first primitive")
}
fn assert_close(actual: f32, expected: f32, tolerance: f32) {
assert!((actual - expected).abs() <= tolerance);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetBaseColorFactor_OverrideToDefault_IsNudgedOffDefault::test df553fd4df83e48d4dd74cdd8aa15a737ea3a416bcad802f7110bbfe79928a31 translated
#[test]
fn base_color_override_to_default_is_nudged() {
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
let default = AssetMaterial::default().base_color_factor();
material
.set_base_color_factor_with_color4_boolean(default, Some(true))
.expect("SetBaseColorFactor");
assert_ne!(
color_values(&material.base_color_factor()),
color_values(&AssetMaterial::default().base_color_factor())
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetBaseColorFactor_NotOverride_LeavesExactDefaultUnchanged::test fec94fcfac0f36cc5813ed087a30e04fcc9815bc02072ea3f5dd282b8698a89c translated
#[test]
fn base_color_non_override_keeps_default() {
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
let default = AssetMaterial::default().base_color_factor();
material
.set_base_color_factor_with_color4_boolean(default, None)
.expect("SetBaseColorFactor");
assert_eq!(
color_values(&material.base_color_factor()),
color_values(&AssetMaterial::default().base_color_factor())
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetMetallicFactor_OverrideToOne_ClampsBelowDefault::test 7fcee795160428082f6e579881867c7b6c83f31549077fc28a46d18c75c485c9 translated
#[test]
fn metallic_override_to_one_clamps_below_default() {
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
material
.set_metallic_factor_with_single_boolean(1.0, Some(true))
.expect("SetMetallicFactor");
assert!(material.metallic_factor() < 1.0);
assert_ne!(
material.metallic_factor(),
AssetMaterial::default().metallic_factor()
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetAlphaMode_OverrideToDefaultOpaque_SetsOverrideFlag::test 8af09d12a58083657e27e285802bb3a6a1d1c136397cea53865d964006343715 translated
#[test]
fn alpha_mode_override_sets_flag() {
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
material
.set_alpha_mode_with_gltf_alpha_mode_boolean(GltfAlphaMode::Opaque, Some(true))
.expect("SetAlphaMode");
assert!(material.override_alpha_mode());
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetTextureId_OverrideToNull_UsesSentinelUuid::test d9ebf410d2a55c3619b99524a571396fb268e5edd41de955cb86e4ec8cc55c78 translated
#[test]
fn null_texture_override_uses_sentinel() {
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
material
.set_texture_id(AssetMaterial::TEXTURE_BASE_COLOR, UUID::zero(), Some(true))
.expect("SetTextureId");
uuid_eq(
&material.texture_ids()[AssetMaterial::TEXTURE_BASE_COLOR as usize],
&AssetMaterial::gltf_override_null_uuid(),
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ApplyOverride_SentinelTexture_ClearsBaseTexture::test 17fd8cdb12ed5d1d0aa1b0a05dbcc357f75aa350d5079b066c957da459d9f628 translated
#[test]
fn sentinel_override_clears_base_texture() {
let mut base = AssetMaterial::new_with_constructor().expect("base material");
base.set_texture_id(
AssetMaterial::TEXTURE_BASE_COLOR,
UUID::random().expect("UUID Random"),
None,
)
.expect("base texture");
let mut override_ = AssetMaterial::new_with_constructor().expect("override material");
override_
.set_texture_id(AssetMaterial::TEXTURE_BASE_COLOR, UUID::zero(), Some(true))
.expect("override texture");
base.apply_override(override_).expect("ApplyOverride");
uuid_eq(
&base.texture_ids()[AssetMaterial::TEXTURE_BASE_COLOR as usize],
&UUID::zero(),
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ApplyOverride_UntouchedTexture_LeavesBaseTextureAlone::test 80ec5e369e3682d92ec6996841b15bda38a3ef6edcd36a2fd9893d8c15459348 translated
#[test]
fn untouched_override_keeps_base_texture() {
let original = UUID::random().expect("UUID Random");
let original_copy = UUID::new_with_bytes_int32(original.get_bytes().expect("UUID bytes"), 0)
.expect("UUID copy");
let mut base = AssetMaterial::new_with_constructor().expect("base material");
base.set_texture_id(AssetMaterial::TEXTURE_BASE_COLOR, original, None)
.expect("base texture");
let override_ = AssetMaterial::new_with_constructor().expect("override material");
base.apply_override(override_).expect("ApplyOverride");
uuid_eq(
&base.texture_ids()[AssetMaterial::TEXTURE_BASE_COLOR as usize],
&original_copy,
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ApplyOverride_ChangedScalar_ReplacesBaseValue::test 4c305c54c4e451932fbd4a4719957f92f38a7f7d28259559b43cb95fcf9250d1 translated
#[test]
fn changed_scalar_override_replaces_base() {
let mut base = AssetMaterial::new_with_constructor().expect("base material");
let mut override_ = AssetMaterial::new_with_constructor().expect("override material");
override_
.set_roughness_factor_with_single_boolean(0.3, Some(true))
.expect("SetRoughnessFactor");
base.apply_override(override_).expect("ApplyOverride");
assert_eq!(base.roughness_factor(), 0.3);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetBaseMaterial_ResetsFieldsButKeepsTransforms::test 39312602e736fd8607a41d9e6b6348bfaf6e659cf3f63100ee15edd20b672306 translated
#[test]
fn set_base_material_keeps_texture_transforms() {
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
material.set_name("Foo".into());
material
.set_roughness_factor_with_single_boolean(0.2, Some(true))
.expect("SetRoughnessFactor");
material
.set_texture_offset(AssetMaterial::TEXTURE_BASE_COLOR, vector2(0.5, 0.25))
.expect("SetTextureOffset");
material.set_base_material().expect("SetBaseMaterial");
assert_eq!(material.name(), "");
assert_eq!(
material.roughness_factor(),
AssetMaterial::default().roughness_factor()
);
assert_eq!(
vector2_values(
&material.texture_transforms()[AssetMaterial::TEXTURE_BASE_COLOR as usize].offset,
),
vector2_values(&vector2(0.5, 0.25))
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToOverrideOsd_RoundTrip_PreservesOverriddenFields::test 8d542528a14e3b4dcb74ea8a940a44673aada51f98baf8abcdd59a06f36e3cb0 translated
#[test]
fn override_osd_round_trip_preserves_fields() {
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
material
.set_roughness_factor_with_single_boolean(0.4, Some(true))
.expect("SetRoughnessFactor");
material
.set_metallic_factor_with_single_boolean(0.6, Some(true))
.expect("SetMetallicFactor");
let texture = UUID::random().expect("UUID Random");
let expected =
UUID::new_with_bytes_int32(texture.get_bytes().expect("UUID bytes"), 0).expect("UUID copy");
material
.set_texture_id(AssetMaterial::TEXTURE_EMISSIVE, texture, Some(true))
.expect("SetTextureId");
material
.set_texture_rotation(AssetMaterial::TEXTURE_EMISSIVE, 1.25)
.expect("SetTextureRotation");
let osd = material.to_override_osd().expect("ToOverrideOsd");
let round_trip = AssetMaterial::from_override_osd(osd).expect("FromOverrideOsd");
assert_eq!(round_trip.roughness_factor(), 0.4);
assert_eq!(round_trip.metallic_factor(), 0.6);
uuid_eq(
&round_trip.texture_ids()[AssetMaterial::TEXTURE_EMISSIVE as usize],
&expected,
);
assert_eq!(
round_trip.texture_transforms()[AssetMaterial::TEXTURE_EMISSIVE as usize].rotation,
1.25
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToOverrideOsd_UntouchedMaterial_ProducesEmptyMap::test c9e29f7ec0e6b28579e0499e3ec89841e01a313a9386ba60257e5e701129b1c2 translated
#[test]
fn untouched_material_override_osd_is_empty() {
let material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
let osd: OSDMap = material.to_override_osd().expect("ToOverrideOsd");
assert_eq!(osd.count(), 0);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToOverrideOsd_OverrideToDefaultRoughness_StillEncodesField::test 4ea9920c6709bd29858a8da66313fcee5ebebd646743c5d822dd6c9e477bf3b4 translated
#[test]
fn default_roughness_override_is_encoded() {
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
material
.set_roughness_factor_with_single_boolean(
AssetMaterial::default().roughness_factor(),
Some(true),
)
.expect("SetRoughnessFactor");
let osd = material.to_override_osd().expect("ToOverrideOsd");
assert!(osd.contains_key("rf".into()).expect("ContainsKey"));
let round_trip = AssetMaterial::from_override_osd(osd).expect("FromOverrideOsd");
assert_ne!(
round_trip.roughness_factor(),
AssetMaterial::default().roughness_factor()
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToJson_RoundTrip_PreservesNameAndColor::test d7ae4270d82671a970fc1b6457292860d24481dd84e9fb919ae60fded5f1914e translated
#[test]
fn material_json_round_trip_preserves_name_and_color() {
let mut material = AssetMaterial::new_with_constructor().expect("AssetMaterial constructor");
material.set_name("Chrome".into());
material
.set_base_color_factor_with_color4_boolean(color(0.1, 0.2, 0.3, 1.0), None)
.expect("SetBaseColorFactor");
let json = material.to_json().expect("AssetMaterial ToJson");
let decoded =
AssetMaterial::new_with_uuid_bytes(UUID::random().expect("UUID Random"), json.into_bytes())
.expect("AssetMaterial bytes constructor");
assert_eq!(decoded.name(), "Chrome");
assert_eq!(
color_values(&decoded.base_color_factor()),
color_values(&material.base_color_factor())
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.LoadGltf_ParsesSceneGraph::test e20583d8de31f793d1dc49d1dfde89e1eb8c00186359e7df4184e862ec9ed649 translated
#[test]
fn gltf_parses_scene_graph() {
let document = load_document();
assert_eq!(document.version(), "2.0");
assert_eq!(document.generator().as_deref(), Some("Test"));
assert_eq!(document.default_scene(), 0);
assert_eq!(document.scenes().len(), 1);
assert_eq!(document.scenes()[0].nodes().len(), 1);
assert_eq!(document.nodes().len(), 1);
assert_eq!(document.nodes()[0].mesh(), 0);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.LoadGltf_ParsesMeshAndPrimitive::test ef6a76308db1966423c7746f5414f3d0553587efc388bbedb962f38cc122ecaf translated
#[test]
fn gltf_parses_mesh_and_primitive() {
let document = load_document();
assert_eq!(document.meshes().len(), 1);
assert_eq!(document.meshes()[0].name().as_deref(), Some("Triangle"));
assert_eq!(document.meshes()[0].primitives().len(), 1);
let primitive = first_primitive(&document);
assert!(primitive.attributes().contains_key("POSITION"));
assert_eq!(primitive.indices(), 1);
assert_eq!(primitive.material(), 0);
assert_eq!(primitive.mode(), GltfPrimitiveMode::Triangles);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.LoadGltf_ParsesMaterial::test 0147b4d7102c5223f247f69fa4cf3daeb0aa6300ad46ef34d6a17163b694c13e translated
#[test]
fn gltf_parses_material() {
let document = load_document();
assert_eq!(document.materials().len(), 1);
let material = &document.materials()[0];
assert_eq!(material.name().as_deref(), Some("Mat"));
assert_close(material.base_color_factor().r, 1.0, 1e-4);
assert_close(material.base_color_factor().g, 0.5, 1e-4);
assert_close(material.metallic_factor(), 0.0, 1e-4);
assert_close(material.roughness_factor(), 1.0, 1e-4);
assert_eq!(material.alpha_mode(), GltfAlphaMode::Opaque);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetPositions_ReturnsCorrectTriangle::test c3d444122ab73794a011d5a5aafb0c2aa030975393f967e871dc88db200f5e96 translated
#[test]
fn gltf_positions_are_correct_triangle() {
let document = load_document();
let positions = document
.get_positions(first_primitive(&document))
.expect("GetPositions");
assert_eq!(positions.len(), 3);
assert_eq!(
vector3_values(&positions[0]),
vector3_values(&Vector3::zero())
);
assert_close(positions[1].x, 1.0, 1e-5);
assert_close(positions[1].y, 0.0, 1e-5);
assert_close(positions[2].x, 0.0, 1e-5);
assert_close(positions[2].y, 1.0, 1e-5);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetIndices_ReturnsCorrectValues::test fa39e87a3dfee7258d9a95907a97cbb107f5add7d6a6f9d9800249bb67e2fc58 translated
#[test]
fn gltf_indices_are_correct() {
let document = load_document();
let indices = document
.get_indices(first_primitive(&document))
.expect("GetIndices");
assert_eq!(indices, [0, 1, 2]);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetPositions_EmptyWhenNoAttribute::test 06c691911ee6933f1884f6540d69afafa1f272acfed827c628580438204d9b4b translated
#[test]
fn gltf_positions_empty_without_attribute() {
let document = load_document();
let primitive = GltfPrimitive::new().expect("GltfPrimitive constructor");
assert_eq!(
document
.get_positions(primitive)
.expect("GetPositions")
.len(),
0
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetNormals_EmptyWhenNoAttribute::test e04480b0b9e23cb561cc55e744ebd85203c759f98ad69febeeb291919f0d91af translated
#[test]
fn gltf_normals_empty_without_attribute() {
let document = load_document();
assert_eq!(
document
.get_normals(first_primitive(&document))
.expect("GetNormals")
.len(),
0
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ToJson_RoundTrip_PreservesSceneGraph::test 41c385b7bde3f8e4f4ad98d4f1f737fc6ccc241c2613526fd745eb35430386b2 translated
#[test]
fn gltf_json_round_trip_preserves_scene_graph() {
let original = load_document();
let json = original.to_json(None).expect("GltfDocument ToJson");
let round_trip = GltfDocument::load_gltf(json, None).expect("GltfDocument LoadGltf");
assert_eq!(round_trip.scenes().len(), original.scenes().len());
assert_eq!(round_trip.nodes().len(), original.nodes().len());
assert_eq!(round_trip.meshes().len(), original.meshes().len());
assert_eq!(round_trip.materials().len(), original.materials().len());
assert_close(
round_trip.materials()[0].base_color_factor().r,
original.materials()[0].base_color_factor().r,
1e-4,
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ToGlb_RoundTrip_PreservesGeometry::test 1e97fe2d1492ac195f6a4386329c76ad131ab99a41b8e03216b1bab8b48fae36 translated
#[test]
fn glb_round_trip_preserves_geometry() {
let original = load_document();
let glb = original.to_glb().expect("GltfDocument ToGlb");
assert_eq!(&glb[..4], &[0x67, 0x6c, 0x54, 0x46]);
let round_trip = GltfDocument::load(glb, None).expect("GltfDocument Load");
let positions = round_trip
.get_positions(first_primitive(&round_trip))
.expect("GetPositions");
assert_eq!(positions.len(), 3);
assert_close(positions[1].x, 1.0, 1e-5);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.Load_AutoDetectsGlbVsJson::test 6d07930be2302e504ef9ece3fef10f47b855d33ae6c8bff152e82df0beb2a474 translated
#[test]
fn gltf_load_auto_detects_glb_and_json() {
let original = load_document();
let glb = original.to_glb().expect("GltfDocument ToGlb");
let json = original.to_json(None).expect("GltfDocument ToJson");
let from_glb = GltfDocument::load(glb, None).expect("load GLB");
let from_json = GltfDocument::load(json.into_bytes(), None).expect("load JSON");
assert_eq!(from_glb.meshes().len(), 1);
assert_eq!(from_json.meshes().len(), 1);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ParseNode_TrsDefaults::test 0f0fbe116d20276c2aee917b940bded9de277ed0b3e3b659844c5b3532755259 translated
#[test]
fn gltf_node_trs_defaults() {
let document = load_document();
let node = &document.nodes()[0];
assert!(node.matrix().is_none());
assert_eq!(
vector3_values(&node.translation()),
vector3_values(&Vector3::zero())
);
assert_eq!(
quaternion_values(&node.rotation()),
quaternion_values(&Quaternion::identity())
);
assert_eq!(
vector3_values(&node.scale()),
vector3_values(&Vector3::one())
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ParseNode_ExplicitMatrix::test 197ba2ee3a66cbb7d927acea13ce9dc84e62af8a500d939957749039118755c8 translated
#[test]
fn gltf_node_explicit_matrix() {
let document = GltfDocument::load_gltf(
r#"{
"asset": { "version": "2.0" },
"nodes": [{
"matrix": [1,0,0,0, 0,1,0,0, 0,0,1,0, 5,6,7,1]
}]
}"#
.into(),
None,
)
.expect("GltfDocument LoadGltf");
let matrix = document.nodes()[0]
.matrix()
.flatten()
.expect("explicit matrix");
assert_close(matrix.m14, 5.0, 1e-5);
assert_close(matrix.m24, 6.0, 1e-5);
assert_close(matrix.m34, 7.0, 1e-5);
}

View File

@@ -1146,175 +1146,6 @@ fn appearance_tests_avatar_appearance_event_args_decode_visual_para_a90e5fb90200
); );
} }
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetBaseColorFactor_OverrideToDefault_IsNudgedOffDefault::test df553fd4df83e48d4dd74cdd8aa15a737ea3a416bcad802f7110bbfe79928a31 pending
#[test]
fn asset_material_override_tests_set_base_color_factor_override_to_524dfc923df0() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetBaseColorFactor_OverrideToDefault_IsNudgedOffDefault::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
43,
"AssetMaterialOverrideTests.SetBaseColorFactor_OverrideToDefault_IsNudgedOffDefault",
"[Test]",
"df553fd4df83e48d4dd74cdd8aa15a737ea3a416bcad802f7110bbfe79928a31",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetBaseColorFactor_NotOverride_LeavesExactDefaultUnchanged::test fec94fcfac0f36cc5813ed087a30e04fcc9815bc02072ea3f5dd282b8698a89c pending
#[test]
fn asset_material_override_tests_set_base_color_factor_not_override_65f758d426e3() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetBaseColorFactor_NotOverride_LeavesExactDefaultUnchanged::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
52,
"AssetMaterialOverrideTests.SetBaseColorFactor_NotOverride_LeavesExactDefaultUnchanged",
"[Test]",
"fec94fcfac0f36cc5813ed087a30e04fcc9815bc02072ea3f5dd282b8698a89c",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetMetallicFactor_OverrideToOne_ClampsBelowDefault::test 7fcee795160428082f6e579881867c7b6c83f31549077fc28a46d18c75c485c9 pending
#[test]
fn asset_material_override_tests_set_metallic_factor_override_to_on_1ed9219c51f1() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetMetallicFactor_OverrideToOne_ClampsBelowDefault::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
61,
"AssetMaterialOverrideTests.SetMetallicFactor_OverrideToOne_ClampsBelowDefault",
"[Test]",
"7fcee795160428082f6e579881867c7b6c83f31549077fc28a46d18c75c485c9",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetAlphaMode_OverrideToDefaultOpaque_SetsOverrideFlag::test 8af09d12a58083657e27e285802bb3a6a1d1c136397cea53865d964006343715 pending
#[test]
fn asset_material_override_tests_set_alpha_mode_override_to_default_f1540b0cfbcb() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetAlphaMode_OverrideToDefaultOpaque_SetsOverrideFlag::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
71,
"AssetMaterialOverrideTests.SetAlphaMode_OverrideToDefaultOpaque_SetsOverrideFlag",
"[Test]",
"8af09d12a58083657e27e285802bb3a6a1d1c136397cea53865d964006343715",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetTextureId_OverrideToNull_UsesSentinelUuid::test d9ebf410d2a55c3619b99524a571396fb268e5edd41de955cb86e4ec8cc55c78 pending
#[test]
fn asset_material_override_tests_set_texture_id_override_to_null_us_b8fc60e6cd5b() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetTextureId_OverrideToNull_UsesSentinelUuid::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
80,
"AssetMaterialOverrideTests.SetTextureId_OverrideToNull_UsesSentinelUuid",
"[Test]",
"d9ebf410d2a55c3619b99524a571396fb268e5edd41de955cb86e4ec8cc55c78",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ApplyOverride_SentinelTexture_ClearsBaseTexture::test 17fd8cdb12ed5d1d0aa1b0a05dbcc357f75aa350d5079b066c957da459d9f628 pending
#[test]
fn asset_material_override_tests_apply_override_sentinel_texture_cl_3923b72f150b() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ApplyOverride_SentinelTexture_ClearsBaseTexture::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
89,
"AssetMaterialOverrideTests.ApplyOverride_SentinelTexture_ClearsBaseTexture",
"[Test]",
"17fd8cdb12ed5d1d0aa1b0a05dbcc357f75aa350d5079b066c957da459d9f628",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ApplyOverride_UntouchedTexture_LeavesBaseTextureAlone::test 80ec5e369e3682d92ec6996841b15bda38a3ef6edcd36a2fd9893d8c15459348 pending
#[test]
fn asset_material_override_tests_apply_override_untouched_texture_l_3f9bd6f143b4() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ApplyOverride_UntouchedTexture_LeavesBaseTextureAlone::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
103,
"AssetMaterialOverrideTests.ApplyOverride_UntouchedTexture_LeavesBaseTextureAlone",
"[Test]",
"80ec5e369e3682d92ec6996841b15bda38a3ef6edcd36a2fd9893d8c15459348",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ApplyOverride_ChangedScalar_ReplacesBaseValue::test 4c305c54c4e451932fbd4a4719957f92f38a7f7d28259559b43cb95fcf9250d1 pending
#[test]
fn asset_material_override_tests_apply_override_changed_scalar_repl_59fe25df1043() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ApplyOverride_ChangedScalar_ReplacesBaseValue::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
116,
"AssetMaterialOverrideTests.ApplyOverride_ChangedScalar_ReplacesBaseValue",
"[Test]",
"4c305c54c4e451932fbd4a4719957f92f38a7f7d28259559b43cb95fcf9250d1",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetBaseMaterial_ResetsFieldsButKeepsTransforms::test 39312602e736fd8607a41d9e6b6348bfaf6e659cf3f63100ee15edd20b672306 pending
#[test]
fn asset_material_override_tests_set_base_material_resets_fields_bu_7454b1df78b8() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.SetBaseMaterial_ResetsFieldsButKeepsTransforms::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
128,
"AssetMaterialOverrideTests.SetBaseMaterial_ResetsFieldsButKeepsTransforms",
"[Test]",
"39312602e736fd8607a41d9e6b6348bfaf6e659cf3f63100ee15edd20b672306",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToOverrideOsd_RoundTrip_PreservesOverriddenFields::test 8d542528a14e3b4dcb74ea8a940a44673aada51f98baf8abcdd59a06f36e3cb0 pending
#[test]
fn asset_material_override_tests_to_override_osd_round_trip_preserv_bc452d8188d4() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToOverrideOsd_RoundTrip_PreservesOverriddenFields::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
142,
"AssetMaterialOverrideTests.ToOverrideOsd_RoundTrip_PreservesOverriddenFields",
"[Test]",
"8d542528a14e3b4dcb74ea8a940a44673aada51f98baf8abcdd59a06f36e3cb0",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToOverrideOsd_UntouchedMaterial_ProducesEmptyMap::test c9e29f7ec0e6b28579e0499e3ec89841e01a313a9386ba60257e5e701129b1c2 pending
#[test]
fn asset_material_override_tests_to_override_osd_untouched_material_53ec36a31e92() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToOverrideOsd_UntouchedMaterial_ProducesEmptyMap::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
161,
"AssetMaterialOverrideTests.ToOverrideOsd_UntouchedMaterial_ProducesEmptyMap",
"[Test]",
"c9e29f7ec0e6b28579e0499e3ec89841e01a313a9386ba60257e5e701129b1c2",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToOverrideOsd_OverrideToDefaultRoughness_StillEncodesField::test 4ea9920c6709bd29858a8da66313fcee5ebebd646743c5d822dd6c9e477bf3b4 pending
#[test]
fn asset_material_override_tests_to_override_osd_override_to_defaul_3607483c81d8() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToOverrideOsd_OverrideToDefaultRoughness_StillEncodesField::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
170,
"AssetMaterialOverrideTests.ToOverrideOsd_OverrideToDefaultRoughness_StillEncodesField",
"[Test]",
"4ea9920c6709bd29858a8da66313fcee5ebebd646743c5d822dd6c9e477bf3b4",
);
}
// parity-case: LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToJson_RoundTrip_PreservesNameAndColor::test d7ae4270d82671a970fc1b6457292860d24481dd84e9fb919ae60fded5f1914e pending
#[test]
fn asset_material_override_tests_to_json_round_trip_preserves_name_34b630798b02() {
pending(
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs::AssetMaterialOverrideTests.ToJson_RoundTrip_PreservesNameAndColor::test",
"LibreMetaverse.Tests/AssetMaterialOverrideTests.cs",
184,
"AssetMaterialOverrideTests.ToJson_RoundTrip_PreservesNameAndColor",
"[Test]",
"d7ae4270d82671a970fc1b6457292860d24481dd84e9fb919ae60fded5f1914e",
);
}
// parity-case: LibreMetaverse.Tests/AvatarManagerTests.cs::AvatarManagerTests.RequestOwnAvatarTextures_WhenNotConnected_DoesNotThrow::test bf3539f68a0adc58c2166289ca1c75f6ff03906f71ffe2fb749f6990404b541a pending // parity-case: LibreMetaverse.Tests/AvatarManagerTests.cs::AvatarManagerTests.RequestOwnAvatarTextures_WhenNotConnected_DoesNotThrow::test bf3539f68a0adc58c2166289ca1c75f6ff03906f71ffe2fb749f6990404b541a pending
#[test] #[test]
fn avatar_manager_tests_request_own_avatar_textures_when_not_connec_65bf42d623a3() { fn avatar_manager_tests_request_own_avatar_textures_when_not_connec_65bf42d623a3() {
@@ -1705,19 +1536,6 @@ fn constructor_null_argument_tests_avatar_manager_null_throws_cb5d9b5be3dd() {
); );
} }
// parity-case: LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.AssetManager_Null_Throws::test 4fa1be8b233dacf6a5955359f2197ff77ae85ffbf2c3c68fcd8cbe672c2c5f91 pending
#[test]
fn constructor_null_argument_tests_asset_manager_null_throws_3e13a196e349() {
pending(
"LibreMetaverse.Tests/ConstructorNullArgumentTests.cs::ConstructorNullArgumentTests.AssetManager_Null_Throws::test",
"LibreMetaverse.Tests/ConstructorNullArgumentTests.cs",
51,
"ConstructorNullArgumentTests.AssetManager_Null_Throws",
"[Test]",
"4fa1be8b233dacf6a5955359f2197ff77ae85ffbf2c3c68fcd8cbe672c2c5f91",
);
}
// parity-case: LibreMetaverse.Tests/CurrentOutfitFolderTests.cs::CurrentOutfitFolderTests.Constructor_WithNullClient_ThrowsArgumentNullException::test 243079029ec81f92ffbc587007a2421389963f72c7843786c5b9a8634a7ddca3 pending // parity-case: LibreMetaverse.Tests/CurrentOutfitFolderTests.cs::CurrentOutfitFolderTests.Constructor_WithNullClient_ThrowsArgumentNullException::test 243079029ec81f92ffbc587007a2421389963f72c7843786c5b9a8634a7ddca3 pending
#[test] #[test]
fn current_outfit_folder_tests_constructor_with_null_client_throws_b298d1390d84() { fn current_outfit_folder_tests_constructor_with_null_client_throws_b298d1390d84() {
@@ -2498,292 +2316,6 @@ fn experience_preferences_message_tests_extract_experience_permissi_f45e68f52a85
); );
} }
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SetMaterialOverrideAsync_HappyPath_PostsBareArrayWithGltfJson::test 0c51b7b793111f5433e52057f26fa5a98d983e7230fefeb61a7b3408e97f28ee pending
#[test]
fn gltf_material_override_cap_tests_set_material_override_async_hap_e367251af9b3() {
pending(
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SetMaterialOverrideAsync_HappyPath_PostsBareArrayWithGltfJson::test",
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs",
64,
"GLTFMaterialOverrideCapTests.SetMaterialOverrideAsync_HappyPath_PostsBareArrayWithGltfJson",
"[Test]",
"0c51b7b793111f5433e52057f26fa5a98d983e7230fefeb61a7b3408e97f28ee",
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.ClearMaterialOverrideAsync_SendsEmptyGltfJson::test 8394d063ea71447d9ce2b76fd00be1d10967f9193e1eb909c5b9f2da56eec812 pending
#[test]
fn gltf_material_override_cap_tests_clear_material_override_async_s_da5ca65e020f() {
pending(
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.ClearMaterialOverrideAsync_SendsEmptyGltfJson::test",
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs",
86,
"GLTFMaterialOverrideCapTests.ClearMaterialOverrideAsync_SendsEmptyGltfJson",
"[Test]",
"8394d063ea71447d9ce2b76fd00be1d10967f9193e1eb909c5b9f2da56eec812",
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.ApplyMaterialAsync_WithoutOverride_SendsAssetIdOnly::test 1db03ab6710ecf532644398d1fef5e82520e1206058d66fb15c8885fdc8f8363 pending
#[test]
fn gltf_material_override_cap_tests_apply_material_async_without_ov_737df851c5ec() {
pending(
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.ApplyMaterialAsync_WithoutOverride_SendsAssetIdOnly::test",
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs",
100,
"GLTFMaterialOverrideCapTests.ApplyMaterialAsync_WithoutOverride_SendsAssetIdOnly",
"[Test]",
"1db03ab6710ecf532644398d1fef5e82520e1206058d66fb15c8885fdc8f8363",
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_MultipleEntries_SendsSingleArrayBody::test 621dca88e7f1c9e024563204ca05c3c8d9a03c4b5a7b31ec1c006abe6732b47b pending
#[test]
fn gltf_material_override_cap_tests_send_material_updates_async_mul_cb58da19ec16() {
pending(
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_MultipleEntries_SendsSingleArrayBody::test",
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs",
115,
"GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_MultipleEntries_SendsSingleArrayBody",
"[Test]",
"621dca88e7f1c9e024563204ca05c3c8d9a03c4b5a7b31ec1c006abe6732b47b",
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_ServerRejects_ReturnsFalse::test e9fbd95fff84695e2cb1a35943bda768f00cf9015b25e0ae1505dce4dde603a4 pending
#[test]
fn gltf_material_override_cap_tests_send_material_updates_async_ser_cb93a8d1a519() {
pending(
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_ServerRejects_ReturnsFalse::test",
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs",
132,
"GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_ServerRejects_ReturnsFalse",
"[Test]",
"e9fbd95fff84695e2cb1a35943bda768f00cf9015b25e0ae1505dce4dde603a4",
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_NoCapability_ReturnsFalseWithoutRequest::test fdceb6bf865cb23386a6b82a9741f230e5c22b0ec6d37bc2ac8478f29292a49f pending
#[test]
fn gltf_material_override_cap_tests_send_material_updates_async_no_33347d94423b() {
pending(
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs::GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_NoCapability_ReturnsFalseWithoutRequest::test",
"LibreMetaverse.Tests/GLTFMaterialOverrideCapTests.cs",
143,
"GLTFMaterialOverrideCapTests.SendMaterialUpdatesAsync_NoCapability_ReturnsFalseWithoutRequest",
"[Test]",
"fdceb6bf865cb23386a6b82a9741f230e5c22b0ec6d37bc2ac8478f29292a49f",
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_HappyPath_PostsMetadataThenJsonAndReturnsNewAsset::test 5ac0e3c27fa6ebfddc9d7582aefb0684a676413948b055382c43b1b0b1cd7e7e pending
#[test]
fn gltf_material_upload_tests_request_update_material_agent_invento_7a4bca39c53e() {
pending(
"LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_HappyPath_PostsMetadataThenJsonAndReturnsNewAsset::test",
"LibreMetaverse.Tests/GLTFMaterialUploadTests.cs",
68,
"GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_HappyPath_PostsMetadataThenJsonAndReturnsNewAsset",
"[Test]",
"5ac0e3c27fa6ebfddc9d7582aefb0684a676413948b055382c43b1b0b1cd7e7e",
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialTaskInventoryAsync_HappyPath_PostsItemIdAndTaskId::test 7ac0e7d210b1aefa795e479f4da0d2dd4caae0b3bbe84ca124707c3ae005bbbd pending
#[test]
fn gltf_material_upload_tests_request_update_material_task_inventor_fd8625ba00e7() {
pending(
"LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialTaskInventoryAsync_HappyPath_PostsItemIdAndTaskId::test",
"LibreMetaverse.Tests/GLTFMaterialUploadTests.cs",
92,
"GLTFMaterialUploadTests.RequestUpdateMaterialTaskInventoryAsync_HappyPath_PostsItemIdAndTaskId",
"[Test]",
"7ac0e7d210b1aefa795e479f4da0d2dd4caae0b3bbe84ca124707c3ae005bbbd",
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_NoCapability_Throws::test 325269807d778264e571d1518ca9a2ca69a27ba67ad689e580f2636ab595f335 pending
#[test]
fn gltf_material_upload_tests_request_update_material_agent_invento_7791bc207ff4() {
pending(
"LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_NoCapability_Throws::test",
"LibreMetaverse.Tests/GLTFMaterialUploadTests.cs",
115,
"GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_NoCapability_Throws",
"[Test]",
"325269807d778264e571d1518ca9a2ca69a27ba67ad689e580f2636ab595f335",
);
}
// parity-case: LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_UploadedJsonRoundTripsMaterial::test fd059dfc8c9299c3b6583b3b47ba18ae9c92e3ad923f88634019b0ab9f34d401 pending
#[test]
fn gltf_material_upload_tests_request_update_material_agent_invento_90d28f18b77b() {
pending(
"LibreMetaverse.Tests/GLTFMaterialUploadTests.cs::GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_UploadedJsonRoundTripsMaterial::test",
"LibreMetaverse.Tests/GLTFMaterialUploadTests.cs",
131,
"GLTFMaterialUploadTests.RequestUpdateMaterialAgentInventoryAsync_UploadedJsonRoundTripsMaterial",
"[Test]",
"fd059dfc8c9299c3b6583b3b47ba18ae9c92e3ad923f88634019b0ab9f34d401",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.LoadGltf_ParsesSceneGraph::test e20583d8de31f793d1dc49d1dfde89e1eb8c00186359e7df4184e862ec9ed649 pending
#[test]
fn gltf_document_tests_load_gltf_parses_scene_graph_e9c9fd8316fc() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.LoadGltf_ParsesSceneGraph::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
122,
"GltfDocumentTests.LoadGltf_ParsesSceneGraph",
"[Test]",
"e20583d8de31f793d1dc49d1dfde89e1eb8c00186359e7df4184e862ec9ed649",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.LoadGltf_ParsesMeshAndPrimitive::test ef6a76308db1966423c7746f5414f3d0553587efc388bbedb962f38cc122ecaf pending
#[test]
fn gltf_document_tests_load_gltf_parses_mesh_and_primitive_f8dc198d0099() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.LoadGltf_ParsesMeshAndPrimitive::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
136,
"GltfDocumentTests.LoadGltf_ParsesMeshAndPrimitive",
"[Test]",
"ef6a76308db1966423c7746f5414f3d0553587efc388bbedb962f38cc122ecaf",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.LoadGltf_ParsesMaterial::test 0147b4d7102c5223f247f69fa4cf3daeb0aa6300ad46ef34d6a17163b694c13e pending
#[test]
fn gltf_document_tests_load_gltf_parses_material_eee0aa04552d() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.LoadGltf_ParsesMaterial::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
152,
"GltfDocumentTests.LoadGltf_ParsesMaterial",
"[Test]",
"0147b4d7102c5223f247f69fa4cf3daeb0aa6300ad46ef34d6a17163b694c13e",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetPositions_ReturnsCorrectTriangle::test c3d444122ab73794a011d5a5aafb0c2aa030975393f967e871dc88db200f5e96 pending
#[test]
fn gltf_document_tests_get_positions_returns_correct_triangle_c21f69d55a5a() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetPositions_ReturnsCorrectTriangle::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
169,
"GltfDocumentTests.GetPositions_ReturnsCorrectTriangle",
"[Test]",
"c3d444122ab73794a011d5a5aafb0c2aa030975393f967e871dc88db200f5e96",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetIndices_ReturnsCorrectValues::test fa39e87a3dfee7258d9a95907a97cbb107f5add7d6a6f9d9800249bb67e2fc58 pending
#[test]
fn gltf_document_tests_get_indices_returns_correct_values_71e7f84cfa34() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetIndices_ReturnsCorrectValues::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
184,
"GltfDocumentTests.GetIndices_ReturnsCorrectValues",
"[Test]",
"fa39e87a3dfee7258d9a95907a97cbb107f5add7d6a6f9d9800249bb67e2fc58",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetPositions_EmptyWhenNoAttribute::test 06c691911ee6933f1884f6540d69afafa1f272acfed827c628580438204d9b4b pending
#[test]
fn gltf_document_tests_get_positions_empty_when_no_attribute_818287f0a8a6() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetPositions_EmptyWhenNoAttribute::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
197,
"GltfDocumentTests.GetPositions_EmptyWhenNoAttribute",
"[Test]",
"06c691911ee6933f1884f6540d69afafa1f272acfed827c628580438204d9b4b",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetNormals_EmptyWhenNoAttribute::test e04480b0b9e23cb561cc55e744ebd85203c759f98ad69febeeb291919f0d91af pending
#[test]
fn gltf_document_tests_get_normals_empty_when_no_attribute_607e2e5cb4c1() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.GetNormals_EmptyWhenNoAttribute::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
205,
"GltfDocumentTests.GetNormals_EmptyWhenNoAttribute",
"[Test]",
"e04480b0b9e23cb561cc55e744ebd85203c759f98ad69febeeb291919f0d91af",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ToJson_RoundTrip_PreservesSceneGraph::test 41c385b7bde3f8e4f4ad98d4f1f737fc6ccc241c2613526fd745eb35430386b2 pending
#[test]
fn gltf_document_tests_to_json_round_trip_preserves_scene_graph_5b5255fe0162() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ToJson_RoundTrip_PreservesSceneGraph::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
215,
"GltfDocumentTests.ToJson_RoundTrip_PreservesSceneGraph",
"[Test]",
"41c385b7bde3f8e4f4ad98d4f1f737fc6ccc241c2613526fd745eb35430386b2",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ToGlb_RoundTrip_PreservesGeometry::test 1e97fe2d1492ac195f6a4386329c76ad131ab99a41b8e03216b1bab8b48fae36 pending
#[test]
fn gltf_document_tests_to_glb_round_trip_preserves_geometry_a710264726e8() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ToGlb_RoundTrip_PreservesGeometry::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
230,
"GltfDocumentTests.ToGlb_RoundTrip_PreservesGeometry",
"[Test]",
"1e97fe2d1492ac195f6a4386329c76ad131ab99a41b8e03216b1bab8b48fae36",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.Load_AutoDetectsGlbVsJson::test 6d07930be2302e504ef9ece3fef10f47b855d33ae6c8bff152e82df0beb2a474 pending
#[test]
fn gltf_document_tests_load_auto_detects_glb_vs_json_71da4e3c882c() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.Load_AutoDetectsGlbVsJson::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
252,
"GltfDocumentTests.Load_AutoDetectsGlbVsJson",
"[Test]",
"6d07930be2302e504ef9ece3fef10f47b855d33ae6c8bff152e82df0beb2a474",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ParseNode_TrsDefaults::test 0f0fbe116d20276c2aee917b940bded9de277ed0b3e3b659844c5b3532755259 pending
#[test]
fn gltf_document_tests_parse_node_trs_defaults_e08687704186() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ParseNode_TrsDefaults::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
268,
"GltfDocumentTests.ParseNode_TrsDefaults",
"[Test]",
"0f0fbe116d20276c2aee917b940bded9de277ed0b3e3b659844c5b3532755259",
);
}
// parity-case: LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ParseNode_ExplicitMatrix::test 197ba2ee3a66cbb7d927acea13ce9dc84e62af8a500d939957749039118755c8 pending
#[test]
fn gltf_document_tests_parse_node_explicit_matrix_7111222ea972() {
pending(
"LibreMetaverse.Tests/GltfDocumentTests.cs::GltfDocumentTests.ParseNode_ExplicitMatrix::test",
"LibreMetaverse.Tests/GltfDocumentTests.cs",
280,
"GltfDocumentTests.ParseNode_ExplicitMatrix",
"[Test]",
"197ba2ee3a66cbb7d927acea13ce9dc84e62af8a500d939957749039118755c8",
);
}
// parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_ObjectAsset_ResultsInAttachmentInventoryTypeAndParsesFields::test 3ae365ed34f12d036dcd44c94f8568d163cfeec2a58b4975975b77b418770131 pending // parity-case: LibreMetaverse.Tests/InventoryAISClientTests.cs::InventoryAISClientTests.ParseLinksFromEmbedded_ObjectAsset_ResultsInAttachmentInventoryTypeAndParsesFields::test 3ae365ed34f12d036dcd44c94f8568d163cfeec2a58b4975975b77b418770131 pending
#[test] #[test]
fn inventory_ais_client_tests_parse_links_from_embedded_object_asse_f1f1434e9b61() { fn inventory_ais_client_tests_parse_links_from_embedded_object_asse_f1f1434e9b61() {
@@ -4383,58 +3915,6 @@ fn misclassified_link_regression_tests_inventory_store_not_contains_c6334b81470b
); );
} }
// parity-case: LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_StandardRegion_Loads256x256::test c4e3a994baf06b0106a6614e9c3efbcc27e45ff1725f5470d2db6ded1fff6014 pending
#[test]
fn oar_file_terrain_tests_load_terrain_standard_region_loads256x256_d30f28505408() {
pending(
"LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_StandardRegion_Loads256x256::test",
"LibreMetaverse.Tests/OarFileTerrainTests.cs",
38,
"OarFileTerrainTests.LoadTerrain_StandardRegion_Loads256x256",
"[Test]",
"c4e3a994baf06b0106a6614e9c3efbcc27e45ff1725f5470d2db6ded1fff6014",
);
}
// parity-case: LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_Varregion_Loads512x512::test 4820338f10acbb4987e26992d7a7957be58ab6bc548674bf18943ef312962894 pending
#[test]
fn oar_file_terrain_tests_load_terrain_varregion_loads512x512_3d13691091d2() {
pending(
"LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_Varregion_Loads512x512::test",
"LibreMetaverse.Tests/OarFileTerrainTests.cs",
52,
"OarFileTerrainTests.LoadTerrain_Varregion_Loads512x512",
"[Test]",
"4820338f10acbb4987e26992d7a7957be58ab6bc548674bf18943ef312962894",
);
}
// parity-case: LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_WrongByteCount_FailsGracefully::test ff6fb4feb2773c93397d412d0ecf6aef1f3636e823dabb729a7a6cbe94d1513f pending
#[test]
fn oar_file_terrain_tests_load_terrain_wrong_byte_count_fails_grace_ec3513ac9df1() {
pending(
"LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_WrongByteCount_FailsGracefully::test",
"LibreMetaverse.Tests/OarFileTerrainTests.cs",
65,
"OarFileTerrainTests.LoadTerrain_WrongByteCount_FailsGracefully",
"[Test]",
"ff6fb4feb2773c93397d412d0ecf6aef1f3636e823dabb729a7a6cbe94d1513f",
);
}
// parity-case: LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_NonSquarePostCount_FailsGracefully::test 218754e53232cd10318668c70b94ae9d7d541d09598b0490082e023e76d6045f pending
#[test]
fn oar_file_terrain_tests_load_terrain_non_square_post_count_fails_eb432cef07ea() {
pending(
"LibreMetaverse.Tests/OarFileTerrainTests.cs::OarFileTerrainTests.LoadTerrain_NonSquarePostCount_FailsGracefully::test",
"LibreMetaverse.Tests/OarFileTerrainTests.cs",
76,
"OarFileTerrainTests.LoadTerrain_NonSquarePostCount_FailsGracefully",
"[Test]",
"218754e53232cd10318668c70b94ae9d7d541d09598b0490082e023e76d6045f",
);
}
// parity-case: LibreMetaverse.Tests/OfflineMessagesTests.cs::OfflineMessagesTests.RetrieveInstantMessagesAsync_BareArrayOfArraysResponse_RaisesInstantMessage::test d51f69e0fa1e1e59a5cedec7d60315d1f590848672a9f4f0c5e21d2abff5c372 pending // parity-case: LibreMetaverse.Tests/OfflineMessagesTests.cs::OfflineMessagesTests.RetrieveInstantMessagesAsync_BareArrayOfArraysResponse_RaisesInstantMessage::test d51f69e0fa1e1e59a5cedec7d60315d1f590848672a9f4f0c5e21d2abff5c372 pending
#[test] #[test]
fn offline_messages_tests_retrieve_instant_messages_async_bare_arra_8c068407e556() { fn offline_messages_tests_retrieve_instant_messages_async_bare_arra_8c068407e556() {
@@ -12924,58 +12404,6 @@ fn request_task_inventory_cap_tests_get_task_inventory_async_no_cap_5a4facbe4c47
); );
} }
// parity-case: LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_HappyPath_PostsMetadataThenImageAndReturnsTrue::test 2e02bd16ef1431c2ca82d7804dffc764be0175cff5daff8c38d0a61641439e06 pending
#[test]
fn send_postcard_tests_send_postcard_async_happy_path_posts_metadat_27d152f2a096() {
pending(
"LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_HappyPath_PostsMetadataThenImageAndReturnsTrue::test",
"LibreMetaverse.Tests/SendPostcardTests.cs",
68,
"SendPostcardTests.SendPostcardAsync_HappyPath_PostsMetadataThenImageAndReturnsTrue",
"[Test]",
"2e02bd16ef1431c2ca82d7804dffc764be0175cff5daff8c38d0a61641439e06",
);
}
// parity-case: LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_UploaderMissingFromResponse_ReturnsFalseWithoutSecondRequest::test 2f9498d57d7a512399f9b108765e6e8da8e4c937402f9671d580c66332630432 pending
#[test]
fn send_postcard_tests_send_postcard_async_uploader_missing_from_re_c7b08cf04805() {
pending(
"LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_UploaderMissingFromResponse_ReturnsFalseWithoutSecondRequest::test",
"LibreMetaverse.Tests/SendPostcardTests.cs",
100,
"SendPostcardTests.SendPostcardAsync_UploaderMissingFromResponse_ReturnsFalseWithoutSecondRequest",
"[Test]",
"2f9498d57d7a512399f9b108765e6e8da8e4c937402f9671d580c66332630432",
);
}
// parity-case: LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_UploadDoesNotComplete_ReturnsFalse::test 937b682b406506ec9fba9570852bbf8689450a11cbecb85979af97609b1794f9 pending
#[test]
fn send_postcard_tests_send_postcard_async_upload_does_not_complete_daf0dfa42f63() {
pending(
"LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_UploadDoesNotComplete_ReturnsFalse::test",
"LibreMetaverse.Tests/SendPostcardTests.cs",
112,
"SendPostcardTests.SendPostcardAsync_UploadDoesNotComplete_ReturnsFalse",
"[Test]",
"937b682b406506ec9fba9570852bbf8689450a11cbecb85979af97609b1794f9",
);
}
// parity-case: LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_NoCapability_ReturnsFalseWithoutRequest::test 8d3ef84e873096d9388bb7db3eaeeb79c661fd9951e338f71bbf3251ae6580e8 pending
#[test]
fn send_postcard_tests_send_postcard_async_no_capability_returns_fa_d740d1bf524a() {
pending(
"LibreMetaverse.Tests/SendPostcardTests.cs::SendPostcardTests.SendPostcardAsync_NoCapability_ReturnsFalseWithoutRequest::test",
"LibreMetaverse.Tests/SendPostcardTests.cs",
125,
"SendPostcardTests.SendPostcardAsync_NoCapability_ReturnsFalseWithoutRequest",
"[Test]",
"8d3ef84e873096d9388bb7db3eaeeb79c661fd9951e338f71bbf3251ae6580e8",
);
}
// parity-case: LibreMetaverse.Tests/SimConsoleTests.cs::SimConsoleTests.SendSimConsoleCommandAsync_IgnoresPostBody_UsesSimConsoleResponseEvent::test df6eb48241f71c34074be66869c9ae1d5980186583259568728261b5eedd7c48 pending // parity-case: LibreMetaverse.Tests/SimConsoleTests.cs::SimConsoleTests.SendSimConsoleCommandAsync_IgnoresPostBody_UsesSimConsoleResponseEvent::test df6eb48241f71c34074be66869c9ae1d5980186583259568728261b5eedd7c48 pending
#[test] #[test]
fn sim_console_tests_send_sim_console_command_async_ignores_post_bo_3b3a435018b5() { fn sim_console_tests_send_sim_console_command_async_ignores_post_bo_3b3a435018b5() {
@@ -13470,84 +12898,6 @@ fn start_auction_tests_start_auction_does_not_throw_de88bae1b818() {
); );
} }
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_ParsesFourSlotsWithSomeEmpty::test 0b7f2b5a7a95c70f4ed97b9b028f3ec16f1cd427a9d4d1b133523bd331f6b9f2 pending
#[test]
fn terrain_material_override_tests_get_terrain_material_overrides_a_0893832c33e4() {
pending(
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_ParsesFourSlotsWithSomeEmpty::test",
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs",
64,
"TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_ParsesFourSlotsWithSomeEmpty",
"[Test]",
"0b7f2b5a7a95c70f4ed97b9b028f3ec16f1cd427a9d4d1b133523bd331f6b9f2",
);
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_ServerReportsFailure_ReturnsNull::test c66b84662333288b7328822d1f9fa79450075d44a1178a9b0b661671072efe5b pending
#[test]
fn terrain_material_override_tests_get_terrain_material_overrides_a_38163aa2435b() {
pending(
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_ServerReportsFailure_ReturnsNull::test",
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs",
81,
"TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_ServerReportsFailure_ReturnsNull",
"[Test]",
"c66b84662333288b7328822d1f9fa79450075d44a1178a9b0b661671072efe5b",
);
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_NoCapability_ReturnsNullWithoutRequest::test 677f80689e1b6a67893d100e1116805fb9f63c5b6ec33e64a4dc9a4cf24c1237 pending
#[test]
fn terrain_material_override_tests_get_terrain_material_overrides_a_e5357bdd0f3f() {
pending(
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_NoCapability_ReturnsNullWithoutRequest::test",
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs",
92,
"TerrainMaterialOverrideTests.GetTerrainMaterialOverridesAsync_NoCapability_ReturnsNullWithoutRequest",
"[Test]",
"677f80689e1b6a67893d100e1116805fb9f63c5b6ec33e64a4dc9a4cf24c1237",
);
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_MixOfNullAndSet_PostsFourEntries::test a4ce031e565ca7eb1864064d299dbf0c7b715581ce330a57be9c3aa93987e67c pending
#[test]
fn terrain_material_override_tests_set_terrain_material_overrides_a_07edb519d189() {
pending(
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_MixOfNullAndSet_PostsFourEntries::test",
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs",
111,
"TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_MixOfNullAndSet_PostsFourEntries",
"[Test]",
"a4ce031e565ca7eb1864064d299dbf0c7b715581ce330a57be9c3aa93987e67c",
);
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_WrongLength_Throws::test 836099a369b37555049b1c1ddfb9562c57cdef88381b7a79e8b80fe62b169a44 pending
#[test]
fn terrain_material_override_tests_set_terrain_material_overrides_a_d8aba797b9fa() {
pending(
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_WrongLength_Throws::test",
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs",
128,
"TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_WrongLength_Throws",
"[Test]",
"836099a369b37555049b1c1ddfb9562c57cdef88381b7a79e8b80fe62b169a44",
);
}
// parity-case: LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_NoCapability_ReturnsFalseWithoutRequest::test 37948cbc0240910d63782d88c0fb9f1d239215cea34a5aa84ac68a10d0555e87 pending
#[test]
fn terrain_material_override_tests_set_terrain_material_overrides_a_8c4f3c7893c2() {
pending(
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs::TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_NoCapability_ReturnsFalseWithoutRequest::test",
"LibreMetaverse.Tests/TerrainMaterialOverrideTests.cs",
135,
"TerrainMaterialOverrideTests.SetTerrainMaterialOverridesAsync_NoCapability_ReturnsFalseWithoutRequest",
"[Test]",
"37948cbc0240910d63782d88c0fb9f1d239215cea34a5aa84ac68a10d0555e87",
);
}
// parity-case: LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_HighFace_TextureID_IsPreserved::case:d3ad6116f2458248 5f215cd1c50fa8871967653b4667f848c14ff24a3b71906e51aac13c56de1f55 pending // parity-case: LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_HighFace_TextureID_IsPreserved::case:d3ad6116f2458248 5f215cd1c50fa8871967653b4667f848c14ff24a3b71906e51aac13c56de1f55 pending
#[test] #[test]
fn texture_entry_tests_round_trip_high_face_texture_id_is_preserved_c347d30187c6() { fn texture_entry_tests_round_trip_high_face_texture_id_is_preserved_c347d30187c6() {
@@ -13678,84 +13028,6 @@ fn texture_entry_tests_round_trip_all_faces_texture_i_ds_all_preser_953d0ed895bf
); );
} }
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_AgentInventoryItem_SendsBareItemIdAndReturnsNewAsset::test 40ca874a37dade3bfbb391a2b4a75c684cfd7509b269286ccc14d747340d095d pending
#[test]
fn upload_thumbnail_tests_upload_thumbnail_async_agent_inventory_it_7853ea2668d6() {
pending(
"LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_AgentInventoryItem_SendsBareItemIdAndReturnsNewAsset::test",
"LibreMetaverse.Tests/UploadThumbnailTests.cs",
73,
"UploadThumbnailTests.UploadThumbnailAsync_AgentInventoryItem_SendsBareItemIdAndReturnsNewAsset",
"[Test]",
"40ca874a37dade3bfbb391a2b4a75c684cfd7509b269286ccc14d747340d095d",
);
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_TaskInventoryItem_SendsItemIdAndTaskId::test dae80f9a7ba6222a651165f779c123d8472f88a17490e69a1112acc3cec6d108 pending
#[test]
fn upload_thumbnail_tests_upload_thumbnail_async_task_inventory_ite_15374cb2fd4b() {
pending(
"LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_TaskInventoryItem_SendsItemIdAndTaskId::test",
"LibreMetaverse.Tests/UploadThumbnailTests.cs",
92,
"UploadThumbnailTests.UploadThumbnailAsync_TaskInventoryItem_SendsItemIdAndTaskId",
"[Test]",
"dae80f9a7ba6222a651165f779c123d8472f88a17490e69a1112acc3cec6d108",
);
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_KnownLocalFolder_SendsCategoryId::test 1ccca44bbead54fd5041c41fc6560478ba17f9e5d9bacff21096b254d2f526db pending
#[test]
fn upload_thumbnail_tests_upload_thumbnail_async_known_local_folder_9057eab58a2c() {
pending(
"LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_KnownLocalFolder_SendsCategoryId::test",
"LibreMetaverse.Tests/UploadThumbnailTests.cs",
110,
"UploadThumbnailTests.UploadThumbnailAsync_KnownLocalFolder_SendsCategoryId",
"[Test]",
"1ccca44bbead54fd5041c41fc6560478ba17f9e5d9bacff21096b254d2f526db",
);
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_NoCapability_ReturnsNullWithoutRequest::test 2bc1ad18b159c5d62a18d2208ed3cf3c88d3f666a0e0dad8730778cd22b59eda pending
#[test]
fn upload_thumbnail_tests_upload_thumbnail_async_no_capability_retu_58dfa7a20cf9() {
pending(
"LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_NoCapability_ReturnsNullWithoutRequest::test",
"LibreMetaverse.Tests/UploadThumbnailTests.cs",
128,
"UploadThumbnailTests.UploadThumbnailAsync_NoCapability_ReturnsNullWithoutRequest",
"[Test]",
"2bc1ad18b159c5d62a18d2208ed3cf3c88d3f666a0e0dad8730778cd22b59eda",
);
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_MetadataResponseMissingUploader_ReturnsNullWithoutSecondRequest::test 8db3eddf1204ad795e9d5ef15365f422f96191a8b4c24ef3393b03c10d92d662 pending
#[test]
fn upload_thumbnail_tests_upload_thumbnail_async_metadata_response_22f5087ae70e() {
pending(
"LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_MetadataResponseMissingUploader_ReturnsNullWithoutSecondRequest::test",
"LibreMetaverse.Tests/UploadThumbnailTests.cs",
145,
"UploadThumbnailTests.UploadThumbnailAsync_MetadataResponseMissingUploader_ReturnsNullWithoutSecondRequest",
"[Test]",
"8db3eddf1204ad795e9d5ef15365f422f96191a8b4c24ef3393b03c10d92d662",
);
}
// parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_UploadDoesNotComplete_ReturnsNull::test e870f6913e3f45676ce490069930427e6c625072fc1d6ebbf16f503be51df4ae pending
#[test]
fn upload_thumbnail_tests_upload_thumbnail_async_upload_does_not_co_912d32ae591d() {
pending(
"LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_UploadDoesNotComplete_ReturnsNull::test",
"LibreMetaverse.Tests/UploadThumbnailTests.cs",
156,
"UploadThumbnailTests.UploadThumbnailAsync_UploadDoesNotComplete_ReturnsNull",
"[Test]",
"e870f6913e3f45676ce490069930427e6c625072fc1d6ebbf16f503be51df4ae",
);
}
// parity-case: LibreMetaverse.Rendering.Tests/Avatar/AvatarBoneMathTests.cs::AvatarBoneMathTests.BuildBoneWorldMatrices_UnitScale_MatchesNaiveMatrixChain::test 32ea442e98ebfe42238424274aefa960d9bac9a5048c4c971b315b712f870291 pending // parity-case: LibreMetaverse.Rendering.Tests/Avatar/AvatarBoneMathTests.cs::AvatarBoneMathTests.BuildBoneWorldMatrices_UnitScale_MatchesNaiveMatrixChain::test 32ea442e98ebfe42238424274aefa960d9bac9a5048c4c971b315b712f870291 pending
#[test] #[test]
fn avatar_bone_math_tests_build_bone_world_matrices_unit_scale_matc_090b5e2b70fd() { fn avatar_bone_math_tests_build_bone_world_matrices_unit_scale_matc_090b5e2b70fd() {

File diff suppressed because it is too large Load Diff

View File

@@ -171,6 +171,10 @@ MEMBER_RETURN_OVERRIDES = {
"M:LibreMetaverse.Caps.Capabilities": "Vec<String>", "M:LibreMetaverse.Caps.Capabilities": "Vec<String>",
} }
MEMBER_SIGNATURE_OVERRIDES = { MEMBER_SIGNATURE_OVERRIDES = {
"M:LibreMetaverse.AssetManager.#ctor(LibreMetaverse.GridClient)": (
"pub fn new(client: Option<libremetaverse::GridClient>) -> Result<Self, crate::Error>",
"optional_owned",
),
"M:LibreMetaverse.Helpers.ZeroDecode(System.Byte[],System.Int32,System.Byte[])": ( "M:LibreMetaverse.Helpers.ZeroDecode(System.Byte[],System.Int32,System.Byte[])": (
"pub fn zero_decode(src: Option<&[u8]>, srclen: i32, dest: Option<&mut [u8]>) " "pub fn zero_decode(src: Option<&[u8]>, srclen: i32, dest: Option<&mut [u8]>) "
"-> Result<i32, crate::Error>", "-> Result<i32, crate::Error>",
@@ -187,6 +191,18 @@ MEMBER_SIGNATURE_OVERRIDES = {
"-> Result<(), crate::Error>", "-> Result<(), crate::Error>",
"mutable_self,owned,mutable_borrow,mutable_borrow,optional_mutable_borrow", "mutable_self,owned,mutable_borrow,mutable_borrow,optional_mutable_borrow",
), ),
"M:LibreMetaverse.TerrainManager.GetTerrainMaterialOverridesAsync(System.Threading.CancellationToken)": (
"pub async fn get_terrain_material_overrides(&self, cancellation_token: "
"Option<libremetaverse_types::compat::CancellationToken>) "
"-> Result<Option<Vec<Option<libremetaverse::assets::AssetMaterial>>>, crate::Error>",
"shared_self,optional_owned",
),
"M:LibreMetaverse.TerrainManager.SetTerrainMaterialOverridesAsync(LibreMetaverse.Assets.AssetMaterial[],System.Threading.CancellationToken)": (
"pub async fn set_terrain_material_overrides(&self, overrides: "
"Vec<Option<libremetaverse::assets::AssetMaterial>>, cancellation_token: "
"Option<libremetaverse_types::compat::CancellationToken>) -> Result<bool, crate::Error>",
"shared_self,owned,optional_owned",
),
} }
TYPE_USAGE_OVERRIDES = { TYPE_USAGE_OVERRIDES = {
"LibreMetaverse.DictionaryChangeCallback": ( "LibreMetaverse.DictionaryChangeCallback": (
@@ -580,6 +596,10 @@ def method_receiver(owner: dict, item: dict) -> tuple[str, str]:
return "", "none" return "", "none"
if item["name"] == "Deserialize": if item["name"] == "Deserialize":
return "&mut self", "mutable_self" return "&mut self", "mutable_self"
if owner["doc_id"] == "T:LibreMetaverse.Assets.AssetMaterial" and item["name"].startswith(
("Apply", "Decode", "Encode", "Set")
):
return "&mut self", "mutable_self"
if owner["doc_id"] == "T:LibreMetaverse.BitPack" and item["name"].startswith(("Pack", "Unpack")): if owner["doc_id"] == "T:LibreMetaverse.BitPack" and item["name"].startswith(("Pack", "Unpack")):
return "&mut self", "mutable_self" return "&mut self", "mutable_self"
if ( if (

View File

@@ -388,10 +388,14 @@ def extract_tests(upstream: Path) -> list[dict[str, object]]:
return tests return tests
def review_paths(root: Path) -> list[Path]:
review_roots = (root / "tests" / "compat" / "tests", root / "crates")
return sorted(path for review_root in review_roots for path in review_root.rglob("*.rs"))
def reviewed_tests(root: Path) -> dict[str, dict[str, object]]: def reviewed_tests(root: Path) -> dict[str, dict[str, object]]:
reviews: dict[str, dict[str, object]] = {} reviews: dict[str, dict[str, object]] = {}
tests_root = root / "tests" / "compat" / "tests" for path in review_paths(root):
for path in sorted(tests_root.rglob("*.rs")):
if path.name == "generated_parity.rs": if path.name == "generated_parity.rs":
continue continue
text = path.read_text() text = path.read_text()
@@ -532,7 +536,7 @@ def generate_tests(upstream: Path, output: Path, review_root: Path | None = None
def scan_parity_markers(root: Path) -> dict[str, list[dict[str, object]]]: def scan_parity_markers(root: Path) -> dict[str, list[dict[str, object]]]:
markers: defaultdict[str, list[dict[str, object]]] = defaultdict(list) markers: defaultdict[str, list[dict[str, object]]] = defaultdict(list)
for path in sorted((root / "tests" / "compat" / "tests").rglob("*.rs")): for path in review_paths(root):
text = path.read_text() text = path.read_text()
for marker in PARITY_MARKER_RE.finditer(text): for marker in PARITY_MARKER_RE.finditer(text):
next_marker = PARITY_MARKER_RE.search(text, marker.end()) next_marker = PARITY_MARKER_RE.search(text, marker.end())

View File

@@ -4,10 +4,33 @@ import unittest
from pathlib import Path from pathlib import Path
from unittest.mock import patch from unittest.mock import patch
from generate_surface import check_test_parity, extract_tests, generate_tests, mask_csharp_comments from generate_surface import (
check_test_parity,
extract_tests,
generate_tests,
mask_csharp_comments,
reviewed_tests,
scan_parity_markers,
)
class ParityGenerationTests(unittest.TestCase): class ParityGenerationTests(unittest.TestCase):
def test_reviewed_tests_include_owning_crate_unit_tests(self) -> None:
with tempfile.TemporaryDirectory() as temporary:
root = Path(temporary)
rust_file = root / "crates" / "example" / "src" / "internal_semantics.rs"
rust_file.parent.mkdir(parents=True)
case_id = "Example.Tests.cs::ExampleTests.InternalMember::test"
rust_file.write_text(
f"// parity-case: {case_id} {'a' * 64} translated\n"
"#[test]\nfn internal_member() {}\n"
)
review = reviewed_tests(root)[case_id]
self.assertEqual(review["rust_file"], "crates/example/src/internal_semantics.rs")
self.assertEqual(review["rust_test"], "internal_member")
self.assertEqual(scan_parity_markers(root)[case_id][0], review)
def test_comment_masking_preserves_offsets_and_ignores_fake_tests(self) -> None: def test_comment_masking_preserves_offsets_and_ignores_fake_tests(self) -> None:
source = '''var url = "https://example.com/[Test]"; // [Test]\n/* [TestCase(1)] */\n[Test]\n''' source = '''var url = "https://example.com/[Test]"; // [Test]\n/* [TestCase(1)] */\n[Test]\n'''
masked = mask_csharp_comments(source) masked = mask_csharp_comments(source)