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
bodies;
- 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
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;
- 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,
translated, ignored-live, benchmark, drifted, missing, duplicate, stale, and
unreviewed cases. The initial handover contained 1,289 unreviewed cases; the
current ledger contains 149 translated, three ignored-live, four
benchmark-reviewed, and 1,133 pending cases.
current ledger contains 205 translated, three ignored-live, four
benchmark-reviewed, and 1,077 pending cases.
The Rust tests must call the public APIs rather than internal replacements.
Where the C# tests call internal members through friend-assembly access, record

View File

@@ -47,7 +47,7 @@ External member APIs are not copied. Each signature type resolves to Rust core/s
- Properties/indexers/events: **5,090 / 11 / 268**
- Delegates and flags enums: **40 / 46**
- Optional/ref/out/in parameters: **470 / 6,144 / 555 / 0**
- Async Rust signatures: **334**
- Async Rust signatures: **332**
- Descriptively renamed overloads: **7,151**
- 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.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.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.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
@@ -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.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.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.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.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.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(&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(&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.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.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.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.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.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.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.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.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.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.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.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.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.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(&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(&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(&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(&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(&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(&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(&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(&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(&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(&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(&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.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
@@ -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.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.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.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.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<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.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
Can't render this file because it is too large.

View File

@@ -51,6 +51,8 @@ pub enum Error {
ArgumentNull,
/// An argument value or length was invalid.
Argument,
/// The requested operation was not valid in the object's current state.
InvalidOperation,
/// An index or destination buffer boundary was exceeded.
IndexOutOfRange,
/// An operation observed a requested cancellation.
@@ -63,7 +65,11 @@ impl Error {
pub const fn csharp_member(self) -> Option<&'static str> {
match self {
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::ArgumentNull => formatter.write_str("required argument was null"),
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::Cancelled => formatter.write_str("operation was cancelled"),
}
@@ -152,5 +159,9 @@ mod tests {
.expect("placeholder panic must retain its visible marker");
assert_eq!(message, &format!("{PANIC_PREFIX}{MEMBER}"));
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")
}
/// 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(
"M:LibreMetaverse.AssetManager.#ctor(LibreMetaverse.GridClient)",
)
@@ -27523,7 +27523,7 @@ impl TerrainManager {
pub async fn get_terrain_material_overrides(
&self,
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(
"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)`.
pub async fn set_terrain_material_overrides(
&self,
overrides: Vec<libremetaverse::assets::AssetMaterial>,
overrides: Vec<Option<libremetaverse::assets::AssetMaterial>>,
cancellation_token: Option<libremetaverse_types::compat::CancellationToken>,
) -> Result<bool, crate::Error> {
libremetaverse_types::not_implemented(
@@ -29804,7 +29804,7 @@ pub mod assets {
}
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.ApplyOverride(LibreMetaverse.Assets.AssetMaterial)`.
pub fn apply_override(
&self,
&mut self,
override_mat: libremetaverse::assets::AssetMaterial,
) -> Result<(), crate::Error> {
libremetaverse_types::not_implemented(
@@ -29812,11 +29812,11 @@ pub mod assets {
)
}
/// 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")
}
/// 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")
}
/// 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)`.
pub fn set_alpha_cutoff_with_single_boolean(
&self,
&mut self,
cutoff: f32,
for_override: Option<bool>,
) -> Result<(), crate::Error> {
@@ -29839,7 +29839,7 @@ pub mod assets {
}
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetAlphaMode(LibreMetaverse.Assets.GltfAlphaMode,System.Boolean)`.
pub fn set_alpha_mode_with_gltf_alpha_mode_boolean(
&self,
&mut self,
mode: libremetaverse::assets::GltfAlphaMode,
for_override: Option<bool>,
) -> Result<(), crate::Error> {
@@ -29849,7 +29849,7 @@ pub mod assets {
}
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetBaseColorFactor(LibreMetaverse.Color4,System.Boolean)`.
pub fn set_base_color_factor_with_color4_boolean(
&self,
&mut self,
color: libremetaverse_types::Color4,
for_override: Option<bool>,
) -> Result<(), crate::Error> {
@@ -29858,14 +29858,14 @@ pub mod assets {
)
}
/// 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(
"M:LibreMetaverse.Assets.AssetMaterial.SetBaseMaterial",
)
}
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetDoubleSided(System.Boolean,System.Boolean)`.
pub fn set_double_sided_with_boolean_boolean(
&self,
&mut self,
double_sided: bool,
for_override: Option<bool>,
) -> Result<(), crate::Error> {
@@ -29875,7 +29875,7 @@ pub mod assets {
}
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetEmissiveFactor(LibreMetaverse.Vector3,System.Boolean)`.
pub fn set_emissive_factor_with_vector3_boolean(
&self,
&mut self,
color: libremetaverse_types::Vector3,
for_override: Option<bool>,
) -> Result<(), crate::Error> {
@@ -29885,7 +29885,7 @@ pub mod assets {
}
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetMetallicFactor(System.Single,System.Boolean)`.
pub fn set_metallic_factor_with_single_boolean(
&self,
&mut self,
metallic: f32,
for_override: Option<bool>,
) -> Result<(), crate::Error> {
@@ -29895,7 +29895,7 @@ pub mod assets {
}
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetRoughnessFactor(System.Single,System.Boolean)`.
pub fn set_roughness_factor_with_single_boolean(
&self,
&mut self,
roughness: f32,
for_override: Option<bool>,
) -> Result<(), crate::Error> {
@@ -29905,7 +29905,7 @@ pub mod assets {
}
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureId(System.Int32,LibreMetaverse.UUID,System.Boolean)`.
pub fn set_texture_id(
&self,
&mut self,
slot: i32,
id: libremetaverse_types::UUID,
for_override: Option<bool>,
@@ -29916,7 +29916,7 @@ pub mod assets {
}
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureOffset(System.Int32,LibreMetaverse.Vector2)`.
pub fn set_texture_offset(
&self,
&mut self,
slot: i32,
offset: libremetaverse_types::Vector2,
) -> Result<(), crate::Error> {
@@ -29925,14 +29925,18 @@ pub mod assets {
)
}
/// 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(
"M:LibreMetaverse.Assets.AssetMaterial.SetTextureRotation(System.Int32,System.Single)",
)
}
/// C# member: `M:LibreMetaverse.Assets.AssetMaterial.SetTextureScale(System.Int32,LibreMetaverse.Vector2)`.
pub fn set_texture_scale(
&self,
&mut self,
slot: i32,
scale: libremetaverse_types::Vector2,
) -> Result<(), crate::Error> {

View File

@@ -4,6 +4,9 @@ extern crate self as libremetaverse;
mod generated;
#[cfg(test)]
mod asset_archive_semantics;
pub use generated::*;
pub use libremetaverse_imaging as imaging_abstractions;
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
#[test]
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
#[test]
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
#[test]
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
#[test]
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
#[test]
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
#[test]
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
#[test]
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>",
}
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[])": (
"pub fn zero_decode(src: Option<&[u8]>, srclen: i32, dest: Option<&mut [u8]>) "
"-> Result<i32, crate::Error>",
@@ -187,6 +191,18 @@ MEMBER_SIGNATURE_OVERRIDES = {
"-> Result<(), crate::Error>",
"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 = {
"LibreMetaverse.DictionaryChangeCallback": (
@@ -580,6 +596,10 @@ def method_receiver(owner: dict, item: dict) -> tuple[str, str]:
return "", "none"
if item["name"] == "Deserialize":
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")):
return "&mut self", "mutable_self"
if (

View File

@@ -388,10 +388,14 @@ def extract_tests(upstream: Path) -> list[dict[str, object]]:
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]]:
reviews: dict[str, dict[str, object]] = {}
tests_root = root / "tests" / "compat" / "tests"
for path in sorted(tests_root.rglob("*.rs")):
for path in review_paths(root):
if path.name == "generated_parity.rs":
continue
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]]]:
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()
for marker in PARITY_MARKER_RE.finditer(text):
next_marker = PARITY_MARKER_RE.search(text, marker.end())

View File

@@ -4,10 +4,33 @@ import unittest
from pathlib import Path
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):
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:
source = '''var url = "https://example.com/[Test]"; // [Test]\n/* [TestCase(1)] */\n[Test]\n'''
masked = mask_csharp_comments(source)