Translate types and utilities tests
Some checks failed
Rust API gates / api-gates (push) Has been cancelled
Some checks failed
Rust API gates / api-gates (push) Has been cancelled
This commit is contained in:
@@ -13216,7 +13216,7 @@ M:LibreMetaverse.ObjectPropertiesUpdatedEventArgs.#ctor(LibreMetaverse.Simulator
|
|||||||
M:LibreMetaverse.ObservableDictionary`2.#ctor constructor LibreMetaverse.ObservableDictionary<TKey, TValue>() libremetaverse libremetaverse::ObservableDictionary::new_with_constructor pub fn new_with_constructor() -> Result<Self, crate::Error> none sync Result<_, crate::Error> descriptive_overload_name method mapped
|
M:LibreMetaverse.ObservableDictionary`2.#ctor constructor LibreMetaverse.ObservableDictionary<TKey, TValue>() libremetaverse libremetaverse::ObservableDictionary::new_with_constructor pub fn new_with_constructor() -> Result<Self, crate::Error> none sync Result<_, crate::Error> descriptive_overload_name method mapped
|
||||||
M:LibreMetaverse.ObservableDictionary`2.#ctor(System.Int32) constructor LibreMetaverse.ObservableDictionary<TKey, TValue>(System.Int32 capacity) libremetaverse libremetaverse::ObservableDictionary::new_with_int32 pub fn new_with_int32(capacity: i32) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> descriptive_overload_name method mapped
|
M:LibreMetaverse.ObservableDictionary`2.#ctor(System.Int32) constructor LibreMetaverse.ObservableDictionary<TKey, TValue>(System.Int32 capacity) libremetaverse libremetaverse::ObservableDictionary::new_with_int32 pub fn new_with_int32(capacity: i32) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> descriptive_overload_name method mapped
|
||||||
M:LibreMetaverse.ObservableDictionary`2.Add(`0,`1) method System.Void LibreMetaverse.ObservableDictionary<TKey, TValue>.Add(TKey key, TValue value) libremetaverse libremetaverse::ObservableDictionary::add pub fn add(&self, key: TKey, value: Option<TValue>) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
M:LibreMetaverse.ObservableDictionary`2.Add(`0,`1) method System.Void LibreMetaverse.ObservableDictionary<TKey, TValue>.Add(TKey key, TValue value) libremetaverse libremetaverse::ObservableDictionary::add pub fn add(&self, key: TKey, value: Option<TValue>) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||||
M:LibreMetaverse.ObservableDictionary`2.AddDelegate(LibreMetaverse.DictionaryEventAction,LibreMetaverse.DictionaryChangeCallback) method System.Void LibreMetaverse.ObservableDictionary<TKey, TValue>.AddDelegate(LibreMetaverse.DictionaryEventAction action, LibreMetaverse.DictionaryChangeCallback callback) libremetaverse libremetaverse::ObservableDictionary::add_delegate pub fn add_delegate(&self, action: libremetaverse::DictionaryEventAction, callback: libremetaverse::DictionaryChangeCallback) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
M:LibreMetaverse.ObservableDictionary`2.AddDelegate(LibreMetaverse.DictionaryEventAction,LibreMetaverse.DictionaryChangeCallback) method System.Void LibreMetaverse.ObservableDictionary<TKey, TValue>.AddDelegate(LibreMetaverse.DictionaryEventAction action, LibreMetaverse.DictionaryChangeCallback callback) libremetaverse libremetaverse::ObservableDictionary::add_delegate pub fn add_delegate(&self, action: libremetaverse::DictionaryEventAction, callback: std::sync::Arc<dyn Fn(libremetaverse::DictionaryEventAction, libremetaverse_types::compat::DictionaryEntry) + Send + Sync>) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||||
M:LibreMetaverse.ObservableDictionary`2.Clear method System.Void LibreMetaverse.ObservableDictionary<TKey, TValue>.Clear() libremetaverse libremetaverse::ObservableDictionary::clear pub fn clear(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
|
M:LibreMetaverse.ObservableDictionary`2.Clear method System.Void LibreMetaverse.ObservableDictionary<TKey, TValue>.Clear() libremetaverse libremetaverse::ObservableDictionary::clear pub fn clear(&self) -> Result<(), crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
|
||||||
M:LibreMetaverse.ObservableDictionary`2.ContainsKey(`0) method System.Boolean LibreMetaverse.ObservableDictionary<TKey, TValue>.ContainsKey(TKey key) libremetaverse libremetaverse::ObservableDictionary::contains_key pub fn contains_key(&self, key: TKey) -> Result<bool, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
M:LibreMetaverse.ObservableDictionary`2.ContainsKey(`0) method System.Boolean LibreMetaverse.ObservableDictionary<TKey, TValue>.ContainsKey(TKey key) libremetaverse libremetaverse::ObservableDictionary::contains_key pub fn contains_key(&self, key: TKey) -> Result<bool, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||||
M:LibreMetaverse.ObservableDictionary`2.ContainsValue(`1) method System.Boolean LibreMetaverse.ObservableDictionary<TKey, TValue>.ContainsValue(TValue value) libremetaverse libremetaverse::ObservableDictionary::contains_value pub fn contains_value(&self, value: Option<TValue>) -> Result<bool, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
M:LibreMetaverse.ObservableDictionary`2.ContainsValue(`1) method System.Boolean LibreMetaverse.ObservableDictionary<TKey, TValue>.ContainsValue(TValue value) libremetaverse libremetaverse::ObservableDictionary::contains_value pub fn contains_value(&self, value: Option<TValue>) -> Result<bool, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||||
@@ -13225,7 +13225,7 @@ M:LibreMetaverse.ObservableDictionary`2.FindAll(System.Predicate{`0}) method Sys
|
|||||||
M:LibreMetaverse.ObservableDictionary`2.FindAll(System.Predicate{`1}) method System.Collections.Generic.List<TValue> LibreMetaverse.ObservableDictionary<TKey, TValue>.FindAll(System.Predicate<TValue> match) libremetaverse libremetaverse::ObservableDictionary::find_all_with_predicate_6d98ccd2 pub fn find_all_with_predicate_6d98ccd2(&self, match_: Box<dyn Fn(&Option<TValue>) -> bool + Send + Sync>) -> Result<Vec<Option<TValue>>, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name_with_stable_id method mapped
|
M:LibreMetaverse.ObservableDictionary`2.FindAll(System.Predicate{`1}) method System.Collections.Generic.List<TValue> LibreMetaverse.ObservableDictionary<TKey, TValue>.FindAll(System.Predicate<TValue> match) libremetaverse libremetaverse::ObservableDictionary::find_all_with_predicate_6d98ccd2 pub fn find_all_with_predicate_6d98ccd2(&self, match_: Box<dyn Fn(&Option<TValue>) -> bool + Send + Sync>) -> Result<Vec<Option<TValue>>, crate::Error> shared_self,owned sync Result<_, crate::Error> descriptive_overload_name_with_stable_id method mapped
|
||||||
M:LibreMetaverse.ObservableDictionary`2.GetEnumerator method System.Collections.IEnumerator LibreMetaverse.ObservableDictionary<TKey, TValue>.GetEnumerator() libremetaverse libremetaverse::ObservableDictionary::get_enumerator pub fn get_enumerator(&self) -> Result<libremetaverse_types::compat::IEnumerator, crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
|
M:LibreMetaverse.ObservableDictionary`2.GetEnumerator method System.Collections.IEnumerator LibreMetaverse.ObservableDictionary<TKey, TValue>.GetEnumerator() libremetaverse libremetaverse::ObservableDictionary::get_enumerator pub fn get_enumerator(&self) -> Result<libremetaverse_types::compat::IEnumerator, crate::Error> shared_self sync Result<_, crate::Error> direct_snake_case method mapped
|
||||||
M:LibreMetaverse.ObservableDictionary`2.Remove(`0) method System.Boolean LibreMetaverse.ObservableDictionary<TKey, TValue>.Remove(TKey key) libremetaverse libremetaverse::ObservableDictionary::remove pub fn remove(&self, key: TKey) -> Result<bool, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
M:LibreMetaverse.ObservableDictionary`2.Remove(`0) method System.Boolean LibreMetaverse.ObservableDictionary<TKey, TValue>.Remove(TKey key) libremetaverse libremetaverse::ObservableDictionary::remove pub fn remove(&self, key: TKey) -> Result<bool, crate::Error> shared_self,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||||
M:LibreMetaverse.ObservableDictionary`2.RemoveDelegate(LibreMetaverse.DictionaryEventAction,LibreMetaverse.DictionaryChangeCallback) method System.Void LibreMetaverse.ObservableDictionary<TKey, TValue>.RemoveDelegate(LibreMetaverse.DictionaryEventAction action, LibreMetaverse.DictionaryChangeCallback callback) libremetaverse libremetaverse::ObservableDictionary::remove_delegate pub fn remove_delegate(&self, action: libremetaverse::DictionaryEventAction, callback: libremetaverse::DictionaryChangeCallback) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
M:LibreMetaverse.ObservableDictionary`2.RemoveDelegate(LibreMetaverse.DictionaryEventAction,LibreMetaverse.DictionaryChangeCallback) method System.Void LibreMetaverse.ObservableDictionary<TKey, TValue>.RemoveDelegate(LibreMetaverse.DictionaryEventAction action, LibreMetaverse.DictionaryChangeCallback callback) libremetaverse libremetaverse::ObservableDictionary::remove_delegate pub fn remove_delegate(&self, action: libremetaverse::DictionaryEventAction, callback: std::sync::Arc<dyn Fn(libremetaverse::DictionaryEventAction, libremetaverse_types::compat::DictionaryEntry) + Send + Sync>) -> Result<(), crate::Error> shared_self,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||||
M:LibreMetaverse.ObservableDictionary`2.TryGetValue(`0,`1@) method System.Boolean LibreMetaverse.ObservableDictionary<TKey, TValue>.TryGetValue(TKey key, out TValue& value) libremetaverse libremetaverse::ObservableDictionary::try_get_value pub fn try_get_value(&self, key: TKey, value: &mut Option<TValue>) -> bool shared_self,owned,mutable_output sync infallible_placeholder direct_snake_case method mapped
|
M:LibreMetaverse.ObservableDictionary`2.TryGetValue(`0,`1@) method System.Boolean LibreMetaverse.ObservableDictionary<TKey, TValue>.TryGetValue(TKey key, out TValue& value) libremetaverse libremetaverse::ObservableDictionary::try_get_value pub fn try_get_value(&self, key: TKey, value: &mut Option<TValue>) -> bool shared_self,owned,mutable_output sync infallible_placeholder direct_snake_case method mapped
|
||||||
M:LibreMetaverse.PacketEventDictionary.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.PacketEventDictionary(LibreMetaverse.GridClient client) libremetaverse libremetaverse::PacketEventDictionary::new pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
|
M:LibreMetaverse.PacketEventDictionary.#ctor(LibreMetaverse.GridClient) constructor LibreMetaverse.PacketEventDictionary(LibreMetaverse.GridClient client) libremetaverse libremetaverse::PacketEventDictionary::new pub fn new(client: libremetaverse::GridClient) -> Result<Self, crate::Error> owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||||
M:LibreMetaverse.PacketEventDictionary.InvokeRaiseEvent(LibreMetaverse.Packets.PacketType,LibreMetaverse.Packets.Packet,LibreMetaverse.Simulator) method System.Void LibreMetaverse.PacketEventDictionary.InvokeRaiseEvent(LibreMetaverse.Packets.PacketType packetType, LibreMetaverse.Packets.Packet packet, LibreMetaverse.Simulator simulator) libremetaverse libremetaverse::PacketEventDictionary::invoke_raise_event pub fn invoke_raise_event(&self, packet_type: libremetaverse::packets::PacketType, packet: libremetaverse::packets::Packet, simulator: libremetaverse::Simulator) -> Result<(), crate::Error> shared_self,owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
M:LibreMetaverse.PacketEventDictionary.InvokeRaiseEvent(LibreMetaverse.Packets.PacketType,LibreMetaverse.Packets.Packet,LibreMetaverse.Simulator) method System.Void LibreMetaverse.PacketEventDictionary.InvokeRaiseEvent(LibreMetaverse.Packets.PacketType packetType, LibreMetaverse.Packets.Packet packet, LibreMetaverse.Simulator simulator) libremetaverse libremetaverse::PacketEventDictionary::invoke_raise_event pub fn invoke_raise_event(&self, packet_type: libremetaverse::packets::PacketType, packet: libremetaverse::packets::Packet, simulator: libremetaverse::Simulator) -> Result<(), crate::Error> shared_self,owned,owned,owned sync Result<_, crate::Error> direct_snake_case method mapped
|
||||||
|
|||||||
|
Can't render this file because it is too large.
|
@@ -5,6 +5,10 @@
|
|||||||
//! ported.
|
//! ported.
|
||||||
|
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
use std::sync::{
|
||||||
|
Arc,
|
||||||
|
atomic::{AtomicBool, Ordering},
|
||||||
|
};
|
||||||
|
|
||||||
pub trait Collection<T> {}
|
pub trait Collection<T> {}
|
||||||
|
|
||||||
@@ -13,7 +17,21 @@ pub trait ReadWrite: std::io::Read + std::io::Write {}
|
|||||||
impl<T: std::io::Read + std::io::Write> ReadWrite for T {}
|
impl<T: std::io::Read + std::io::Write> ReadWrite for T {}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||||
pub struct Object(u8);
|
pub enum Object {
|
||||||
|
String(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<String> for Object {
|
||||||
|
fn from(value: String) -> Self {
|
||||||
|
Self::String(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&str> for Object {
|
||||||
|
fn from(value: &str) -> Self {
|
||||||
|
Self::String(value.to_owned())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
|
||||||
pub struct Utf16CodeUnit(pub u16);
|
pub struct Utf16CodeUnit(pub u16);
|
||||||
@@ -63,13 +81,20 @@ pub struct XmlTextReader(pub String);
|
|||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct XmlTextWriter(pub String);
|
pub struct XmlTextWriter(pub String);
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
|
#[derive(Clone, Debug, Default)]
|
||||||
pub struct CancellationToken;
|
pub struct CancellationToken(Arc<AtomicBool>);
|
||||||
|
|
||||||
|
impl CancellationToken {
|
||||||
|
#[must_use]
|
||||||
|
pub fn is_cancellation_requested(&self) -> bool {
|
||||||
|
self.0.load(Ordering::Acquire)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
|
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
|
||||||
pub struct Subscription;
|
pub struct Subscription;
|
||||||
|
|
||||||
pub struct EventHandler<T>(pub PhantomData<fn(T)>);
|
pub type EventHandler<T> = Arc<dyn Fn(T) + Send + Sync>;
|
||||||
|
|
||||||
pub struct DictionaryKeys<TKey, TValue>(pub Vec<TKey>, pub PhantomData<fn(TValue)>);
|
pub struct DictionaryKeys<TKey, TValue>(pub Vec<TKey>, pub PhantomData<fn(TValue)>);
|
||||||
|
|
||||||
@@ -77,9 +102,36 @@ pub struct DictionaryEntry(pub Object, pub Object);
|
|||||||
|
|
||||||
pub struct RateLimitLease;
|
pub struct RateLimitLease;
|
||||||
|
|
||||||
pub struct CancellationTokenSource;
|
#[derive(Clone, Debug, Default)]
|
||||||
|
pub struct CancellationTokenSource(CancellationToken);
|
||||||
|
|
||||||
pub trait Close {}
|
impl CancellationTokenSource {
|
||||||
|
#[must_use]
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[must_use]
|
||||||
|
pub fn token(&self) -> CancellationToken {
|
||||||
|
self.0.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn cancel(&self) {
|
||||||
|
self.0.0.store(true, Ordering::Release);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Close {
|
||||||
|
/// Releases the mapped disposable resource.
|
||||||
|
///
|
||||||
|
/// # Errors
|
||||||
|
///
|
||||||
|
/// Returns the mapped disposal error, or an unimplemented error until the
|
||||||
|
/// owning resource supplies its implementation.
|
||||||
|
fn close(&mut self) -> Result<(), ExternalError> {
|
||||||
|
Err(ExternalError("Close::close is not implemented".to_owned()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Thread;
|
pub struct Thread;
|
||||||
|
|
||||||
|
|||||||
@@ -1216,6 +1216,7 @@ pub enum Material {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// C# type: `T:LibreMetaverse.Matrix4`.
|
/// C# type: `T:LibreMetaverse.Matrix4`.
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub struct Matrix4 {
|
pub struct Matrix4 {
|
||||||
/// C# member: `F:LibreMetaverse.Matrix4.M11`.
|
/// C# member: `F:LibreMetaverse.Matrix4.M11`.
|
||||||
pub m11: f32,
|
pub m11: f32,
|
||||||
@@ -2163,6 +2164,7 @@ pub enum ProfileCurve {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// C# type: `T:LibreMetaverse.Quaternion`.
|
/// C# type: `T:LibreMetaverse.Quaternion`.
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub struct Quaternion {
|
pub struct Quaternion {
|
||||||
/// C# member: `F:LibreMetaverse.Quaternion.W`.
|
/// C# member: `F:LibreMetaverse.Quaternion.W`.
|
||||||
pub w: f32,
|
pub w: f32,
|
||||||
@@ -2654,6 +2656,7 @@ impl TokenBucket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// C# type: `T:LibreMetaverse.UUID`.
|
/// C# type: `T:LibreMetaverse.UUID`.
|
||||||
|
#[derive(Clone, Copy, Debug, Default)]
|
||||||
pub struct UUID {
|
pub struct UUID {
|
||||||
bytes: [u8; 16],
|
bytes: [u8; 16],
|
||||||
}
|
}
|
||||||
@@ -3905,6 +3908,7 @@ impl Vector2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// C# type: `T:LibreMetaverse.Vector3`.
|
/// C# type: `T:LibreMetaverse.Vector3`.
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub struct Vector3 {
|
pub struct Vector3 {
|
||||||
/// C# member: `F:LibreMetaverse.Vector3.X`.
|
/// C# member: `F:LibreMetaverse.Vector3.X`.
|
||||||
pub x: f32,
|
pub x: f32,
|
||||||
@@ -4345,6 +4349,7 @@ impl Vector3 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// C# type: `T:LibreMetaverse.Vector3d`.
|
/// C# type: `T:LibreMetaverse.Vector3d`.
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub struct Vector3d {
|
pub struct Vector3d {
|
||||||
/// C# member: `F:LibreMetaverse.Vector3d.X`.
|
/// C# member: `F:LibreMetaverse.Vector3d.X`.
|
||||||
pub x: f64,
|
pub x: f64,
|
||||||
|
|||||||
@@ -21523,7 +21523,13 @@ impl<TKey, TValue> ObservableDictionary<TKey, TValue> {
|
|||||||
pub fn add_delegate(
|
pub fn add_delegate(
|
||||||
&self,
|
&self,
|
||||||
action: libremetaverse::DictionaryEventAction,
|
action: libremetaverse::DictionaryEventAction,
|
||||||
callback: libremetaverse::DictionaryChangeCallback,
|
callback: std::sync::Arc<
|
||||||
|
dyn Fn(
|
||||||
|
libremetaverse::DictionaryEventAction,
|
||||||
|
libremetaverse_types::compat::DictionaryEntry,
|
||||||
|
) + Send
|
||||||
|
+ Sync,
|
||||||
|
>,
|
||||||
) -> Result<(), crate::Error> {
|
) -> Result<(), crate::Error> {
|
||||||
libremetaverse_types::not_implemented(
|
libremetaverse_types::not_implemented(
|
||||||
"M:LibreMetaverse.ObservableDictionary`2.AddDelegate(LibreMetaverse.DictionaryEventAction,LibreMetaverse.DictionaryChangeCallback)",
|
"M:LibreMetaverse.ObservableDictionary`2.AddDelegate(LibreMetaverse.DictionaryEventAction,LibreMetaverse.DictionaryChangeCallback)",
|
||||||
@@ -21588,7 +21594,13 @@ impl<TKey, TValue> ObservableDictionary<TKey, TValue> {
|
|||||||
pub fn remove_delegate(
|
pub fn remove_delegate(
|
||||||
&self,
|
&self,
|
||||||
action: libremetaverse::DictionaryEventAction,
|
action: libremetaverse::DictionaryEventAction,
|
||||||
callback: libremetaverse::DictionaryChangeCallback,
|
callback: std::sync::Arc<
|
||||||
|
dyn Fn(
|
||||||
|
libremetaverse::DictionaryEventAction,
|
||||||
|
libremetaverse_types::compat::DictionaryEntry,
|
||||||
|
) + Send
|
||||||
|
+ Sync,
|
||||||
|
>,
|
||||||
) -> Result<(), crate::Error> {
|
) -> Result<(), crate::Error> {
|
||||||
libremetaverse_types::not_implemented(
|
libremetaverse_types::not_implemented(
|
||||||
"M:LibreMetaverse.ObservableDictionary`2.RemoveDelegate(LibreMetaverse.DictionaryEventAction,LibreMetaverse.DictionaryChangeCallback)",
|
"M:LibreMetaverse.ObservableDictionary`2.RemoveDelegate(LibreMetaverse.DictionaryEventAction,LibreMetaverse.DictionaryChangeCallback)",
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ Generated from LibreMetaverse `2aa70bb68513b39795da5d13c88f31b86e85a3ba`. Stable
|
|||||||
## Status
|
## Status
|
||||||
|
|
||||||
- Total: **1,289**
|
- Total: **1,289**
|
||||||
- Pending/unreviewed: **1,289**
|
- Pending/unreviewed: **1,272**
|
||||||
- Translated/reviewed: **0**
|
- Translated/reviewed: **17**
|
||||||
- Ignored live/reviewed: **0** (19 upstream live candidates)
|
- Ignored live/reviewed: **0** (19 upstream live candidates)
|
||||||
- Benchmarks/reviewed: **0** (4 upstream benchmark candidates)
|
- Benchmarks/reviewed: **0** (4 upstream benchmark candidates)
|
||||||
- Drifted: **0**
|
- Drifted: **0**
|
||||||
@@ -467,8 +467,8 @@ Reviewed Rust tests live outside `generated_parity.rs` and carry a `parity-case`
|
|||||||
| `LibreMetaverse.Tests/OfflineMessagesTests.cs::OfflineMessagesTests.RetrieveInstantMessagesAsync_MessagesMapResponse_RaisesInstantMessage::test` | `OfflineMessagesTests.RetrieveInstantMessagesAsync_MessagesMapResponse_RaisesInstantMessage` | `` | `LibreMetaverse.Tests/OfflineMessagesTests.cs:94` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `dbce6320d57d12ca5557cfba65257e15be314cde947b20dd21bc386819fcb3ce` |
|
| `LibreMetaverse.Tests/OfflineMessagesTests.cs::OfflineMessagesTests.RetrieveInstantMessagesAsync_MessagesMapResponse_RaisesInstantMessage::test` | `OfflineMessagesTests.RetrieveInstantMessagesAsync_MessagesMapResponse_RaisesInstantMessage` | `` | `LibreMetaverse.Tests/OfflineMessagesTests.cs:94` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `dbce6320d57d12ca5557cfba65257e15be314cde947b20dd21bc386819fcb3ce` |
|
||||||
| `LibreMetaverse.Tests/PacketTests.cs::PacketTests.HeaderFlags::test` | `PacketTests.HeaderFlags` | `` | `LibreMetaverse.Tests/PacketTests.cs:37` | `` | `` | `pending source translation` | `pending` | `89d9955f4a2ccb1fe1de227df0d9dc43a8836145a625b07c69e92e3acdef4c8b` |
|
| `LibreMetaverse.Tests/PacketTests.cs::PacketTests.HeaderFlags::test` | `PacketTests.HeaderFlags` | `` | `LibreMetaverse.Tests/PacketTests.cs:37` | `` | `` | `pending source translation` | `pending` | `89d9955f4a2ccb1fe1de227df0d9dc43a8836145a625b07c69e92e3acdef4c8b` |
|
||||||
| `LibreMetaverse.Tests/PacketTests.cs::PacketTests.ToBytesMultiple::test` | `PacketTests.ToBytesMultiple` | `` | `LibreMetaverse.Tests/PacketTests.cs:108` | `` | `` | `pending source translation` | `pending` | `0e0f06d2317de91147bab1e623bed35ee03015da1498a9b9837c91c144bf7da5` |
|
| `LibreMetaverse.Tests/PacketTests.cs::PacketTests.ToBytesMultiple::test` | `PacketTests.ToBytesMultiple` | `` | `LibreMetaverse.Tests/PacketTests.cs:108` | `` | `` | `pending source translation` | `pending` | `0e0f06d2317de91147bab1e623bed35ee03015da1498a9b9837c91c144bf7da5` |
|
||||||
| `LibreMetaverse.Tests/PositionHelperTests.cs::PositionHelperTests.ToGlobalAndLocalPosition_RoundTrip::test` | `PositionHelperTests.ToGlobalAndLocalPosition_RoundTrip` | `` | `LibreMetaverse.Tests/PositionHelperTests.cs:9` | `Utilities` | `` | `pending source translation` | `pending` | `695c6a640e5353e02def9a1b4a1c1eabb37a8543c13466dff570f58d847e7772` |
|
| `LibreMetaverse.Tests/PositionHelperTests.cs::PositionHelperTests.ToGlobalAndLocalPosition_RoundTrip::test` | `PositionHelperTests.ToGlobalAndLocalPosition_RoundTrip` | `` | `LibreMetaverse.Tests/PositionHelperTests.cs:9` | `Utilities` | `` | `tests/compat/tests/types_utilities.rs:550 (`to_global_and_local_position_round_trip`)` | `translated` | `695c6a640e5353e02def9a1b4a1c1eabb37a8543c13466dff570f58d847e7772` |
|
||||||
| `LibreMetaverse.Tests/PositionHelperTests.cs::PositionHelperTests.FormatCoordinates_FormatsCorrectly::test` | `PositionHelperTests.FormatCoordinates_FormatsCorrectly` | `` | `LibreMetaverse.Tests/PositionHelperTests.cs:29` | `Utilities` | `` | `pending source translation` | `pending` | `fe4256d00dab5cc2de602b7b27442cac627a5956c4ce79c05d92de830f6fc5d2` |
|
| `LibreMetaverse.Tests/PositionHelperTests.cs::PositionHelperTests.FormatCoordinates_FormatsCorrectly::test` | `PositionHelperTests.FormatCoordinates_FormatsCorrectly` | `` | `LibreMetaverse.Tests/PositionHelperTests.cs:29` | `Utilities` | `` | `tests/compat/tests/types_utilities.rs:568 (`format_coordinates_formats_correctly`)` | `translated` | `fe4256d00dab5cc2de602b7b27442cac627a5956c4ce79c05d92de830f6fc5d2` |
|
||||||
| `LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathBegin::test` | `PrimObjectTests.PathBegin` | `` | `LibreMetaverse.Tests/PrimObjectTests.cs:36` | `` | `` | `pending source translation` | `pending` | `5c8e14e1d08a91a4e7c3e252c932b8fe15cf6b5231cc9fe5bb7ef2ae6e2c8299` |
|
| `LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathBegin::test` | `PrimObjectTests.PathBegin` | `` | `LibreMetaverse.Tests/PrimObjectTests.cs:36` | `` | `` | `pending source translation` | `pending` | `5c8e14e1d08a91a4e7c3e252c932b8fe15cf6b5231cc9fe5bb7ef2ae6e2c8299` |
|
||||||
| `LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathEnd::test` | `PrimObjectTests.PathEnd` | `` | `LibreMetaverse.Tests/PrimObjectTests.cs:49` | `` | `` | `pending source translation` | `pending` | `693bfe29f448e433705d65b8b6907f1b270fd636f914e18b76d7a0047dbea506` |
|
| `LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathEnd::test` | `PrimObjectTests.PathEnd` | `` | `LibreMetaverse.Tests/PrimObjectTests.cs:49` | `` | `` | `pending source translation` | `pending` | `693bfe29f448e433705d65b8b6907f1b270fd636f914e18b76d7a0047dbea506` |
|
||||||
| `LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathRevolutions::test` | `PrimObjectTests.PathRevolutions` | `` | `LibreMetaverse.Tests/PrimObjectTests.cs:62` | `` | `` | `pending source translation` | `pending` | `c3f61c80a204e608976cb44a0c10b9651496074c25f254eec8621db65dbbbe37` |
|
| `LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathRevolutions::test` | `PrimObjectTests.PathRevolutions` | `` | `LibreMetaverse.Tests/PrimObjectTests.cs:62` | `` | `` | `pending source translation` | `pending` | `c3f61c80a204e608976cb44a0c10b9651496074c25f254eec8621db65dbbbe37` |
|
||||||
@@ -1119,7 +1119,7 @@ Reviewed Rust tests live outside `generated_parity.rs` and carry a `parity-case`
|
|||||||
| `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithNotificationRestrictions_SendsNotifications::test` | `RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithNotificationRestrictions_SendsNotifications` | `` | `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs:242` | `` | `LibreMetaverse.Tests/RLV/RlvTestBase.cs` | `pending source translation` | `pending` | `ba82b183dfdb01b36f9b45520e1808290c360f327d4afa833ba3b8c7a7cecffb` |
|
| `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithNotificationRestrictions_SendsNotifications::test` | `RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithNotificationRestrictions_SendsNotifications` | `` | `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs:242` | `` | `LibreMetaverse.Tests/RLV/RlvTestBase.cs` | `pending source translation` | `pending` | `ba82b183dfdb01b36f9b45520e1808290c360f327d4afa833ba3b8c7a7cecffb` |
|
||||||
| `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithComplexRestrictions_RemovesCorrectly::test` | `RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithComplexRestrictions_RemovesCorrectly` | `` | `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs:265` | `` | `LibreMetaverse.Tests/RLV/RlvTestBase.cs` | `pending source translation` | `pending` | `631de2d39fa56b29014fae4ce3b57c480f540ad41ce08a0037b7f8bbfcb3c502` |
|
| `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithComplexRestrictions_RemovesCorrectly::test` | `RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithComplexRestrictions_RemovesCorrectly` | `` | `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs:265` | `` | `LibreMetaverse.Tests/RLV/RlvTestBase.cs` | `pending source translation` | `pending` | `631de2d39fa56b29014fae4ce3b57c480f540ad41ce08a0037b7f8bbfcb3c502` |
|
||||||
| `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_TriggersRestrictionUpdatedEvent::test` | `RlvRestrictionManagerTests.RemoveRestrictionsForObjects_TriggersRestrictionUpdatedEvent` | `` | `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs:294` | `` | `LibreMetaverse.Tests/RLV/RlvTestBase.cs` | `pending source translation` | `pending` | `318f1f4207b04d01076d3498aceea781c4889b05cdbef199cdbea43dde355f4c` |
|
| `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_TriggersRestrictionUpdatedEvent::test` | `RlvRestrictionManagerTests.RemoveRestrictionsForObjects_TriggersRestrictionUpdatedEvent` | `` | `LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs:294` | `` | `LibreMetaverse.Tests/RLV/RlvTestBase.cs` | `pending source translation` | `pending` | `318f1f4207b04d01076d3498aceea781c4889b05cdbef199cdbea43dde355f4c` |
|
||||||
| `LibreMetaverse.Tests/ReaderWriterLockTests.cs::ReaderWriterLockTests.MultipleReadersOneWriter_ReaderConcurrencyAndWriterExclusion::test` | `ReaderWriterLockTests.MultipleReadersOneWriter_ReaderConcurrencyAndWriterExclusion` | `` | `LibreMetaverse.Tests/ReaderWriterLockTests.cs:12` | `` | `` | `pending source translation` | `pending` | `bf63804480951667455038244228f77c30454a365b496f062051f7b34e7b2618` |
|
| `LibreMetaverse.Tests/ReaderWriterLockTests.cs::ReaderWriterLockTests.MultipleReadersOneWriter_ReaderConcurrencyAndWriterExclusion::test` | `ReaderWriterLockTests.MultipleReadersOneWriter_ReaderConcurrencyAndWriterExclusion` | `` | `LibreMetaverse.Tests/ReaderWriterLockTests.cs:12` | `` | `` | `tests/compat/tests/types_utilities.rs:592 (`multiple_readers_one_writer_reader_concurrency_and_writer_exclusion`)` | `translated` | `bf63804480951667455038244228f77c30454a365b496f062051f7b34e7b2618` |
|
||||||
| `LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_WeeklySchedule_ParsesDaysAndTime::test` | `RegionScheduleTests.GetRegionRestartScheduleAsync_WeeklySchedule_ParsesDaysAndTime` | `` | `LibreMetaverse.Tests/RegionScheduleTests.cs:64` | `Estate` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `0f64aab66c6a6d807b3d2bbc46b636a85900e4f76e35d5e3dd8cd0d8b295618b` |
|
| `LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_WeeklySchedule_ParsesDaysAndTime::test` | `RegionScheduleTests.GetRegionRestartScheduleAsync_WeeklySchedule_ParsesDaysAndTime` | `` | `LibreMetaverse.Tests/RegionScheduleTests.cs:64` | `Estate` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `0f64aab66c6a6d807b3d2bbc46b636a85900e4f76e35d5e3dd8cd0d8b295618b` |
|
||||||
| `LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_DailySchedule_ReturnsAllDays::test` | `RegionScheduleTests.GetRegionRestartScheduleAsync_DailySchedule_ReturnsAllDays` | `` | `LibreMetaverse.Tests/RegionScheduleTests.cs:79` | `Estate` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `cd966b6e3ba470c91ac958bf6c71aeb34f4dab060ad5334cb6060e1954b5c6d0` |
|
| `LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_DailySchedule_ReturnsAllDays::test` | `RegionScheduleTests.GetRegionRestartScheduleAsync_DailySchedule_ReturnsAllDays` | `` | `LibreMetaverse.Tests/RegionScheduleTests.cs:79` | `Estate` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `cd966b6e3ba470c91ac958bf6c71aeb34f4dab060ad5334cb6060e1954b5c6d0` |
|
||||||
| `LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_NoRestartConfigured_ReturnsNull::test` | `RegionScheduleTests.GetRegionRestartScheduleAsync_NoRestartConfigured_ReturnsNull` | `` | `LibreMetaverse.Tests/RegionScheduleTests.cs:93` | `Estate` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `59a4b050a79659ccaf0fff13b750d634d803ed7b9e4940cbad676c1bdc04a5fc` |
|
| `LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_NoRestartConfigured_ReturnsNull::test` | `RegionScheduleTests.GetRegionRestartScheduleAsync_NoRestartConfigured_ReturnsNull` | `` | `LibreMetaverse.Tests/RegionScheduleTests.cs:93` | `Estate` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `59a4b050a79659ccaf0fff13b750d634d803ed7b9e4940cbad676c1bdc04a5fc` |
|
||||||
@@ -1191,12 +1191,12 @@ Reviewed Rust tests live outside `generated_parity.rs` and carry a `parity-case`
|
|||||||
| `LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_Face32_RepeatU_IsPreserved::test` | `TextureEntryTests.RoundTrip_Face32_RepeatU_IsPreserved` | `` | `LibreMetaverse.Tests/TextureEntryTests.cs:131` | `TextureEntry` | `` | `pending source translation` | `pending` | `58e80815263025ec54cd15e3c9a42771f5e55c81e9acb212a0f163faef9fd499` |
|
| `LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_Face32_RepeatU_IsPreserved::test` | `TextureEntryTests.RoundTrip_Face32_RepeatU_IsPreserved` | `` | `LibreMetaverse.Tests/TextureEntryTests.cs:131` | `TextureEntry` | `` | `pending source translation` | `pending` | `58e80815263025ec54cd15e3c9a42771f5e55c81e9acb212a0f163faef9fd499` |
|
||||||
| `LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_Face32_RepeatV_IsPreserved::test` | `TextureEntryTests.RoundTrip_Face32_RepeatV_IsPreserved` | `` | `LibreMetaverse.Tests/TextureEntryTests.cs:145` | `TextureEntry` | `` | `pending source translation` | `pending` | `fbeb1fdd584a26576b6f1ba653b2995d1a6d6bccc2c1dc51e46aa9f211b78724` |
|
| `LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_Face32_RepeatV_IsPreserved::test` | `TextureEntryTests.RoundTrip_Face32_RepeatV_IsPreserved` | `` | `LibreMetaverse.Tests/TextureEntryTests.cs:145` | `TextureEntry` | `` | `pending source translation` | `pending` | `fbeb1fdd584a26576b6f1ba653b2995d1a6d6bccc2c1dc51e46aa9f211b78724` |
|
||||||
| `LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_AllFaces_TextureIDs_AllPreserved::test` | `TextureEntryTests.RoundTrip_AllFaces_TextureIDs_AllPreserved` | `` | `LibreMetaverse.Tests/TextureEntryTests.cs:158` | `TextureEntry` | `` | `pending source translation` | `pending` | `5e5a390af8deff77ef80f751735456541f24d7e27666557d50d99065cc3ba6a4` |
|
| `LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_AllFaces_TextureIDs_AllPreserved::test` | `TextureEntryTests.RoundTrip_AllFaces_TextureIDs_AllPreserved` | `` | `LibreMetaverse.Tests/TextureEntryTests.cs:158` | `TextureEntry` | `` | `pending source translation` | `pending` | `5e5a390af8deff77ef80f751735456541f24d7e27666557d50d99065cc3ba6a4` |
|
||||||
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.UUIDs::test` | `TypeTests.UUIDs` | `` | `LibreMetaverse.Tests/TypeTests.cs:38` | `` | `` | `pending source translation` | `pending` | `4f95d48c474bbd824254196dd605051773c711614bf661b5aa996054b6c98967` |
|
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.UUIDs::test` | `TypeTests.UUIDs` | `` | `LibreMetaverse.Tests/TypeTests.cs:38` | `` | `` | `tests/compat/tests/types_utilities.rs:39 (`uuids`)` | `translated` | `4f95d48c474bbd824254196dd605051773c711614bf661b5aa996054b6c98967` |
|
||||||
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.Vector3ApproxEquals::test` | `TypeTests.Vector3ApproxEquals` | `` | `LibreMetaverse.Tests/TypeTests.cs:72` | `` | `` | `pending source translation` | `pending` | `1438175bb0c0bd8b17dd878e8fb95fb0dba82abbab71882f2ceb39ec554189d9` |
|
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.Vector3ApproxEquals::test` | `TypeTests.Vector3ApproxEquals` | `` | `LibreMetaverse.Tests/TypeTests.cs:72` | `` | `` | `tests/compat/tests/types_utilities.rs:72 (`vector3_approx_equals`)` | `translated` | `1438175bb0c0bd8b17dd878e8fb95fb0dba82abbab71882f2ceb39ec554189d9` |
|
||||||
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.VectorCasting::test` | `TypeTests.VectorCasting` | `` | `LibreMetaverse.Tests/TypeTests.cs:100` | `` | `` | `pending source translation` | `pending` | `27c0a4b8402ef66f11dca075d8c1a0f0b647ccef9c2803125dde6ca292951cd4` |
|
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.VectorCasting::test` | `TypeTests.VectorCasting` | `` | `LibreMetaverse.Tests/TypeTests.cs:100` | `` | `` | `tests/compat/tests/types_utilities.rs:99 (`vector_casting`)` | `translated` | `27c0a4b8402ef66f11dca075d8c1a0f0b647ccef9c2803125dde6ca292951cd4` |
|
||||||
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.Quaternions::test` | `TypeTests.Quaternions` | `` | `LibreMetaverse.Tests/TypeTests.cs:154` | `` | `` | `pending source translation` | `pending` | `071cf3ef6932e093c0fd09fe461a738e75af905707fce9a321b8f08dd89c09dd` |
|
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.Quaternions::test` | `TypeTests.Quaternions` | `` | `LibreMetaverse.Tests/TypeTests.cs:154` | `` | `` | `tests/compat/tests/types_utilities.rs:141 (`quaternions`)` | `translated` | `071cf3ef6932e093c0fd09fe461a738e75af905707fce9a321b8f08dd89c09dd` |
|
||||||
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.TestMatrix::test` | `TypeTests.TestMatrix` | `` | `LibreMetaverse.Tests/TypeTests.cs:185` | `` | `` | `pending source translation` | `pending` | `5d5ccc8b9ea1741b013fd945e42ba7e6511322fdce51998e358d42c1736457e3` |
|
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.TestMatrix::test` | `TypeTests.TestMatrix` | `` | `LibreMetaverse.Tests/TypeTests.cs:185` | `` | `` | `tests/compat/tests/types_utilities.rs:165 (`test_matrix`)` | `translated` | `5d5ccc8b9ea1741b013fd945e42ba7e6511322fdce51998e358d42c1736457e3` |
|
||||||
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.FloatsToTerseStrings::test` | `TypeTests.FloatsToTerseStrings` | `` | `LibreMetaverse.Tests/TypeTests.cs:223` | `` | `` | `pending source translation` | `pending` | `ce34cdfe106d5dadfa82056e7aa7690d2da748c7e753b9d2a2ad682d86327def` |
|
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.FloatsToTerseStrings::test` | `TypeTests.FloatsToTerseStrings` | `` | `LibreMetaverse.Tests/TypeTests.cs:223` | `` | `` | `tests/compat/tests/types_utilities.rs:194 (`floats_to_terse_strings`)` | `translated` | `ce34cdfe106d5dadfa82056e7aa7690d2da748c7e753b9d2a2ad682d86327def` |
|
||||||
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.BitUnpacking::test` | `TypeTests.BitUnpacking` | `` | `LibreMetaverse.Tests/TypeTests.cs:252` | `` | `` | `pending source translation` | `pending` | `741470d770a0a71853d84e26abaf927fc7dc385dedf0d7de87f63e7a22cb4dd7` |
|
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.BitUnpacking::test` | `TypeTests.BitUnpacking` | `` | `LibreMetaverse.Tests/TypeTests.cs:252` | `` | `` | `pending source translation` | `pending` | `741470d770a0a71853d84e26abaf927fc7dc385dedf0d7de87f63e7a22cb4dd7` |
|
||||||
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.BitPacking::test` | `TypeTests.BitPacking` | `` | `LibreMetaverse.Tests/TypeTests.cs:279` | `` | `` | `pending source translation` | `pending` | `fe3cac4216b588667d56b35496a803097dbc39f84c7a82fd95aa101836588948` |
|
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.BitPacking::test` | `TypeTests.BitPacking` | `` | `LibreMetaverse.Tests/TypeTests.cs:279` | `` | `` | `pending source translation` | `pending` | `fe3cac4216b588667d56b35496a803097dbc39f84c7a82fd95aa101836588948` |
|
||||||
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.LLSDTerseParsing::test` | `TypeTests.LLSDTerseParsing` | `` | `LibreMetaverse.Tests/TypeTests.cs:322` | `` | `` | `pending source translation` | `pending` | `c5fcc05c15fa60c43cd40f5fc2b1349d9fbd1f5bb3537d8b04e91f37302e77f1` |
|
| `LibreMetaverse.Tests/TypeTests.cs::TypeTests.LLSDTerseParsing::test` | `TypeTests.LLSDTerseParsing` | `` | `LibreMetaverse.Tests/TypeTests.cs:322` | `` | `` | `pending source translation` | `pending` | `c5fcc05c15fa60c43cd40f5fc2b1349d9fbd1f5bb3537d8b04e91f37302e77f1` |
|
||||||
@@ -1206,14 +1206,14 @@ Reviewed Rust tests live outside `generated_parity.rs` and carry a `parity-case`
|
|||||||
| `LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_NoCapability_ReturnsNullWithoutRequest::test` | `UploadThumbnailTests.UploadThumbnailAsync_NoCapability_ReturnsNullWithoutRequest` | `` | `LibreMetaverse.Tests/UploadThumbnailTests.cs:128` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `2bc1ad18b159c5d62a18d2208ed3cf3c88d3f666a0e0dad8730778cd22b59eda` |
|
| `LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_NoCapability_ReturnsNullWithoutRequest::test` | `UploadThumbnailTests.UploadThumbnailAsync_NoCapability_ReturnsNullWithoutRequest` | `` | `LibreMetaverse.Tests/UploadThumbnailTests.cs:128` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `2bc1ad18b159c5d62a18d2208ed3cf3c88d3f666a0e0dad8730778cd22b59eda` |
|
||||||
| `LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_MetadataResponseMissingUploader_ReturnsNullWithoutSecondRequest::test` | `UploadThumbnailTests.UploadThumbnailAsync_MetadataResponseMissingUploader_ReturnsNullWithoutSecondRequest` | `` | `LibreMetaverse.Tests/UploadThumbnailTests.cs:145` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `8db3eddf1204ad795e9d5ef15365f422f96191a8b4c24ef3393b03c10d92d662` |
|
| `LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_MetadataResponseMissingUploader_ReturnsNullWithoutSecondRequest::test` | `UploadThumbnailTests.UploadThumbnailAsync_MetadataResponseMissingUploader_ReturnsNullWithoutSecondRequest` | `` | `LibreMetaverse.Tests/UploadThumbnailTests.cs:145` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `8db3eddf1204ad795e9d5ef15365f422f96191a8b4c24ef3393b03c10d92d662` |
|
||||||
| `LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_UploadDoesNotComplete_ReturnsNull::test` | `UploadThumbnailTests.UploadThumbnailAsync_UploadDoesNotComplete_ReturnsNull` | `` | `LibreMetaverse.Tests/UploadThumbnailTests.cs:156` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `e870f6913e3f45676ce490069930427e6c625072fc1d6ebbf16f503be51df4ae` |
|
| `LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_UploadDoesNotComplete_ReturnsNull::test` | `UploadThumbnailTests.UploadThumbnailAsync_UploadDoesNotComplete_ReturnsNull` | `` | `LibreMetaverse.Tests/UploadThumbnailTests.cs:156` | `` | `LibreMetaverse.Tests/TestHelpers/FakeGridClient.cs` | `pending source translation` | `pending` | `e870f6913e3f45676ce490069930427e6c625072fc1d6ebbf16f503be51df4ae` |
|
||||||
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.FileHelper_SanitizeAndSafeNames::test` | `UtilUnitTests.FileHelper_SanitizeAndSafeNames` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:12` | `Utilities` | `` | `pending source translation` | `pending` | `770d1cb751c4b8290c9443bcb4a91d17703628a157cc428c607a7d36ae0af985` |
|
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.FileHelper_SanitizeAndSafeNames::test` | `UtilUnitTests.FileHelper_SanitizeAndSafeNames` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:12` | `Utilities` | `` | `tests/compat/tests/types_utilities.rs:218 (`file_helper_sanitize_and_safe_names`)` | `translated` | `770d1cb751c4b8290c9443bcb4a91d17703628a157cc428c607a7d36ae0af985` |
|
||||||
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.ObservableDictionary_Events_FireOnAddRemoveAndClear::test` | `UtilUnitTests.ObservableDictionary_Events_FireOnAddRemoveAndClear` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:33` | `Utilities` | `` | `pending source translation` | `pending` | `579412c3c839e1fe5b44cf956f8d329a15d4e05c05778b4e6e3ff9b7d2fb7607` |
|
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.ObservableDictionary_Events_FireOnAddRemoveAndClear::test` | `UtilUnitTests.ObservableDictionary_Events_FireOnAddRemoveAndClear` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:33` | `Utilities` | `` | `tests/compat/tests/types_utilities.rs:255 (`observable_dictionary_events_fire_on_add_remove_and_clear`)` | `translated` | `579412c3c839e1fe5b44cf956f8d329a15d4e05c05778b4e6e3ff9b7d2fb7607` |
|
||||||
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.EventSubscriptionHelper_WaitForEventAndAsync::test` | `UtilUnitTests.EventSubscriptionHelper_WaitForEventAndAsync` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:62` | `Utilities` | `` | `pending source translation` | `pending` | `bab59e0caf1630edda9a2a6daecca95cd1a28f189fdde01b1b6afee4cd96d8cb` |
|
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.EventSubscriptionHelper_WaitForEventAndAsync::test` | `UtilUnitTests.EventSubscriptionHelper_WaitForEventAndAsync` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:62` | `Utilities` | `` | `tests/compat/tests/types_utilities.rs:320 (`event_subscription_helper_wait_for_event_and_async`)` | `translated` | `bab59e0caf1630edda9a2a6daecca95cd1a28f189fdde01b1b6afee4cd96d8cb` |
|
||||||
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.Repeat_Interval_ExecutesAndCancels::test` | `UtilUnitTests.Repeat_Interval_ExecutesAndCancels` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:118` | `Utilities` | `` | `pending source translation` | `pending` | `43250eb6d7799ca3c00e51810b3e04d9a874bfdeafd77af6f7b78f8f6c73ff77` |
|
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.Repeat_Interval_ExecutesAndCancels::test` | `UtilUnitTests.Repeat_Interval_ExecutesAndCancels` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:118` | `Utilities` | `` | `tests/compat/tests/types_utilities.rs:410 (`repeat_interval_executes_and_cancels`)` | `translated` | `43250eb6d7799ca3c00e51810b3e04d9a874bfdeafd77af6f7b78f8f6c73ff77` |
|
||||||
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.NameValue_ParseAndToString::test` | `UtilUnitTests.NameValue_ParseAndToString` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:141` | `Utilities` | `` | `pending source translation` | `pending` | `f779a81d286c0028ea202bab00f8db0d1bbaea611003458918a9ec9a24207557` |
|
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.NameValue_ParseAndToString::test` | `UtilUnitTests.NameValue_ParseAndToString` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:141` | `Utilities` | `` | `tests/compat/tests/types_utilities.rs:461 (`name_value_parse_and_to_string`)` | `translated` | `f779a81d286c0028ea202bab00f8db0d1bbaea611003458918a9ec9a24207557` |
|
||||||
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.Helpers_SplitAndFloatToTerseString::test` | `UtilUnitTests.Helpers_SplitAndFloatToTerseString` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:153` | `Utilities` | `` | `pending source translation` | `pending` | `aa2c378f56cfd04d6d4cfa50cd3efafd2b2d479d681336d72fbb9d5ec5c363e6` |
|
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.Helpers_SplitAndFloatToTerseString::test` | `UtilUnitTests.Helpers_SplitAndFloatToTerseString` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:153` | `Utilities` | `` | `tests/compat/tests/types_utilities.rs:483 (`helpers_split_and_float_to_terse_string`)` | `translated` | `aa2c378f56cfd04d6d4cfa50cd3efafd2b2d479d681336d72fbb9d5ec5c363e6` |
|
||||||
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.DisposalHelper_SafeDisposeAndUsing::test` | `UtilUnitTests.DisposalHelper_SafeDisposeAndUsing` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:163` | `Utilities` | `` | `pending source translation` | `pending` | `433ebbfeb69eeb7ceaac86c4b3637468152a1f5a9f4c12ea8d7a74e1cb0c4fec` |
|
| `LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.DisposalHelper_SafeDisposeAndUsing::test` | `UtilUnitTests.DisposalHelper_SafeDisposeAndUsing` | `` | `LibreMetaverse.Tests/UtilUnitTests.cs:163` | `Utilities` | `` | `tests/compat/tests/types_utilities.rs:520 (`disposal_helper_safe_dispose_and_using`)` | `translated` | `433ebbfeb69eeb7ceaac86c4b3637468152a1f5a9f4c12ea8d7a74e1cb0c4fec` |
|
||||||
| `LibreMetaverse.Tests/UtilsConversionsTests.cs::UtilsConversionsTests.StringToBytes::test` | `UtilsConversionsTests.StringToBytes` | `` | `LibreMetaverse.Tests/UtilsConversionsTests.cs:35` | `Utilities` | `` | `pending source translation` | `pending` | `0bef42801dc2a50e132b05440424c44da54b53c853708ee2c0ec9799dbe0e8b2` |
|
| `LibreMetaverse.Tests/UtilsConversionsTests.cs::UtilsConversionsTests.StringToBytes::test` | `UtilsConversionsTests.StringToBytes` | `` | `LibreMetaverse.Tests/UtilsConversionsTests.cs:35` | `Utilities` | `` | `tests/compat/tests/types_utilities.rs:663 (`string_to_bytes`)` | `translated` | `0bef42801dc2a50e132b05440424c44da54b53c853708ee2c0ec9799dbe0e8b2` |
|
||||||
| `LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeLLSDSample::test` | `XmlSDTests.DeserializeLLSDSample` | `` | `LibreMetaverse.Tests/XmlLLSDTests.cs:46` | `` | `` | `pending source translation` | `pending` | `2495e7d5c414b59962f03282c51fe1c0d5de350b51c1bdfcee9ced7c32acbe4d` |
|
| `LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeLLSDSample::test` | `XmlSDTests.DeserializeLLSDSample` | `` | `LibreMetaverse.Tests/XmlLLSDTests.cs:46` | `` | `` | `pending source translation` | `pending` | `2495e7d5c414b59962f03282c51fe1c0d5de350b51c1bdfcee9ced7c32acbe4d` |
|
||||||
| `LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeNoDTD::test` | `XmlSDTests.DeserializeNoDTD` | `` | `LibreMetaverse.Tests/XmlLLSDTests.cs:159` | `` | `` | `pending source translation` | `pending` | `9bc25ce11695355a0b81622301db687495d414c9a293505f6d421f27ac24eb70` |
|
| `LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeNoDTD::test` | `XmlSDTests.DeserializeNoDTD` | `` | `LibreMetaverse.Tests/XmlLLSDTests.cs:159` | `` | `` | `pending source translation` | `pending` | `9bc25ce11695355a0b81622301db687495d414c9a293505f6d421f27ac24eb70` |
|
||||||
| `LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeSillyPI::test` | `XmlSDTests.DeserializeSillyPI` | `` | `LibreMetaverse.Tests/XmlLLSDTests.cs:184` | `` | `` | `pending source translation` | `pending` | `08f94779e33e1dff4bd88eb75c7e032947dfb75f9ac7b14432847e705f08176d` |
|
| `LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeSillyPI::test` | `XmlSDTests.DeserializeSillyPI` | `` | `LibreMetaverse.Tests/XmlLLSDTests.cs:184` | `` | `` | `pending source translation` | `pending` | `08f94779e33e1dff4bd88eb75c7e032947dfb75f9ac7b14432847e705f08176d` |
|
||||||
|
|||||||
@@ -1,11 +1,34 @@
|
|||||||
//! Shared deterministic fixtures used by translated compatibility tests.
|
//! Shared deterministic fixtures used by translated compatibility tests.
|
||||||
|
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
use std::future::Future;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::{Component, Path, PathBuf};
|
use std::path::{Component, Path, PathBuf};
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
|
use std::task::{Context, Poll, Wake, Waker};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
|
/// Runs one test future without choosing an async runtime for the library.
|
||||||
|
pub fn block_on<F: Future>(future: F) -> F::Output {
|
||||||
|
struct ThreadWake(std::thread::Thread);
|
||||||
|
|
||||||
|
impl Wake for ThreadWake {
|
||||||
|
fn wake(self: Arc<Self>) {
|
||||||
|
self.0.unpark();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let waker = Waker::from(Arc::new(ThreadWake(std::thread::current())));
|
||||||
|
let mut context = Context::from_waker(&waker);
|
||||||
|
let mut future = std::pin::pin!(future);
|
||||||
|
loop {
|
||||||
|
match future.as_mut().poll(&mut context) {
|
||||||
|
Poll::Ready(output) => return output,
|
||||||
|
Poll::Pending => std::thread::park(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Asserts equality within the exact absolute tolerance carried by an upstream test.
|
/// Asserts equality within the exact absolute tolerance carried by an upstream test.
|
||||||
///
|
///
|
||||||
/// # Panics
|
/// # Panics
|
||||||
@@ -231,6 +254,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn deterministic_harness_covers_clock_network_and_bytes() {
|
fn deterministic_harness_covers_clock_network_and_bytes() {
|
||||||
|
assert_eq!(block_on(std::future::ready(7)), 7);
|
||||||
assert_close(1.001, 1.0, 0.01);
|
assert_close(1.001, 1.0, 0.01);
|
||||||
assert_bytes_eq(&decode_hex("00 ff 2A").unwrap(), &[0, 255, 42]);
|
assert_bytes_eq(&decode_hex("00 ff 2A").unwrap(), &[0, 255, 42]);
|
||||||
assert!(decode_hex("é").is_err());
|
assert!(decode_hex("é").is_err());
|
||||||
|
|||||||
@@ -19,13 +19,13 @@ async fn compile_login_shutdown_flows(
|
|||||||
limiter: &CapsRateLimiter,
|
limiter: &CapsRateLimiter,
|
||||||
credential: LoginCredential,
|
credential: LoginCredential,
|
||||||
) {
|
) {
|
||||||
let token = CancellationToken;
|
let token = CancellationToken::default();
|
||||||
let _ = network
|
let _ = network
|
||||||
.login_with_login_credential_string_string_cancellation_token(
|
.login_with_login_credential_string_string_cancellation_token(
|
||||||
credential,
|
credential,
|
||||||
String::new(),
|
String::new(),
|
||||||
String::new(),
|
String::new(),
|
||||||
Some(token),
|
Some(token.clone()),
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
let _ = limiter.acquire(Uri(String::new()), Some(token)).await;
|
let _ = limiter.acquire(Uri(String::new()), Some(token)).await;
|
||||||
@@ -44,7 +44,7 @@ async fn compile_request_settings_flows(
|
|||||||
request: DownloadRequest,
|
request: DownloadRequest,
|
||||||
progress: Box<dyn IProgress<HttpCapsClientProgressReport>>,
|
progress: Box<dyn IProgress<HttpCapsClientProgressReport>>,
|
||||||
) {
|
) {
|
||||||
let token = CancellationToken;
|
let token = CancellationToken::default();
|
||||||
let _ = downloads
|
let _ = downloads
|
||||||
.download_with_uri_i_progress_cancellation_token(Uri(String::new()), progress, token)
|
.download_with_uri_i_progress_cancellation_token(Uri(String::new()), progress, token)
|
||||||
.await;
|
.await;
|
||||||
@@ -57,7 +57,7 @@ fn compile_object_safe_texture_request(
|
|||||||
provider: &dyn IBakingTextureProvider,
|
provider: &dyn IBakingTextureProvider,
|
||||||
texture_id: libremetaverse_types::UUID,
|
texture_id: libremetaverse_types::UUID,
|
||||||
) {
|
) {
|
||||||
drop(provider.request_texture(texture_id, Some(CancellationToken)));
|
drop(provider.request_texture(texture_id, Some(CancellationToken::default())));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@@ -454,8 +454,6 @@
|
|||||||
// pending-parity-case: LibreMetaverse.Tests/OfflineMessagesTests.cs::OfflineMessagesTests.RetrieveInstantMessagesAsync_MessagesMapResponse_RaisesInstantMessage::test dbce6320d57d12ca5557cfba65257e15be314cde947b20dd21bc386819fcb3ce
|
// pending-parity-case: LibreMetaverse.Tests/OfflineMessagesTests.cs::OfflineMessagesTests.RetrieveInstantMessagesAsync_MessagesMapResponse_RaisesInstantMessage::test dbce6320d57d12ca5557cfba65257e15be314cde947b20dd21bc386819fcb3ce
|
||||||
// pending-parity-case: LibreMetaverse.Tests/PacketTests.cs::PacketTests.HeaderFlags::test 89d9955f4a2ccb1fe1de227df0d9dc43a8836145a625b07c69e92e3acdef4c8b
|
// pending-parity-case: LibreMetaverse.Tests/PacketTests.cs::PacketTests.HeaderFlags::test 89d9955f4a2ccb1fe1de227df0d9dc43a8836145a625b07c69e92e3acdef4c8b
|
||||||
// pending-parity-case: LibreMetaverse.Tests/PacketTests.cs::PacketTests.ToBytesMultiple::test 0e0f06d2317de91147bab1e623bed35ee03015da1498a9b9837c91c144bf7da5
|
// pending-parity-case: LibreMetaverse.Tests/PacketTests.cs::PacketTests.ToBytesMultiple::test 0e0f06d2317de91147bab1e623bed35ee03015da1498a9b9837c91c144bf7da5
|
||||||
// pending-parity-case: LibreMetaverse.Tests/PositionHelperTests.cs::PositionHelperTests.ToGlobalAndLocalPosition_RoundTrip::test 695c6a640e5353e02def9a1b4a1c1eabb37a8543c13466dff570f58d847e7772
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/PositionHelperTests.cs::PositionHelperTests.FormatCoordinates_FormatsCorrectly::test fe4256d00dab5cc2de602b7b27442cac627a5956c4ce79c05d92de830f6fc5d2
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathBegin::test 5c8e14e1d08a91a4e7c3e252c932b8fe15cf6b5231cc9fe5bb7ef2ae6e2c8299
|
// pending-parity-case: LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathBegin::test 5c8e14e1d08a91a4e7c3e252c932b8fe15cf6b5231cc9fe5bb7ef2ae6e2c8299
|
||||||
// pending-parity-case: LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathEnd::test 693bfe29f448e433705d65b8b6907f1b270fd636f914e18b76d7a0047dbea506
|
// pending-parity-case: LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathEnd::test 693bfe29f448e433705d65b8b6907f1b270fd636f914e18b76d7a0047dbea506
|
||||||
// pending-parity-case: LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathRevolutions::test c3f61c80a204e608976cb44a0c10b9651496074c25f254eec8621db65dbbbe37
|
// pending-parity-case: LibreMetaverse.Tests/PrimObjectTests.cs::PrimObjectTests.PathRevolutions::test c3f61c80a204e608976cb44a0c10b9651496074c25f254eec8621db65dbbbe37
|
||||||
@@ -1106,7 +1104,6 @@
|
|||||||
// pending-parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithNotificationRestrictions_SendsNotifications::test ba82b183dfdb01b36f9b45520e1808290c360f327d4afa833ba3b8c7a7cecffb
|
// pending-parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithNotificationRestrictions_SendsNotifications::test ba82b183dfdb01b36f9b45520e1808290c360f327d4afa833ba3b8c7a7cecffb
|
||||||
// pending-parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithComplexRestrictions_RemovesCorrectly::test 631de2d39fa56b29014fae4ce3b57c480f540ad41ce08a0037b7f8bbfcb3c502
|
// pending-parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithComplexRestrictions_RemovesCorrectly::test 631de2d39fa56b29014fae4ce3b57c480f540ad41ce08a0037b7f8bbfcb3c502
|
||||||
// pending-parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_TriggersRestrictionUpdatedEvent::test 318f1f4207b04d01076d3498aceea781c4889b05cdbef199cdbea43dde355f4c
|
// pending-parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_TriggersRestrictionUpdatedEvent::test 318f1f4207b04d01076d3498aceea781c4889b05cdbef199cdbea43dde355f4c
|
||||||
// pending-parity-case: LibreMetaverse.Tests/ReaderWriterLockTests.cs::ReaderWriterLockTests.MultipleReadersOneWriter_ReaderConcurrencyAndWriterExclusion::test bf63804480951667455038244228f77c30454a365b496f062051f7b34e7b2618
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_WeeklySchedule_ParsesDaysAndTime::test 0f64aab66c6a6d807b3d2bbc46b636a85900e4f76e35d5e3dd8cd0d8b295618b
|
// pending-parity-case: LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_WeeklySchedule_ParsesDaysAndTime::test 0f64aab66c6a6d807b3d2bbc46b636a85900e4f76e35d5e3dd8cd0d8b295618b
|
||||||
// pending-parity-case: LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_DailySchedule_ReturnsAllDays::test cd966b6e3ba470c91ac958bf6c71aeb34f4dab060ad5334cb6060e1954b5c6d0
|
// pending-parity-case: LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_DailySchedule_ReturnsAllDays::test cd966b6e3ba470c91ac958bf6c71aeb34f4dab060ad5334cb6060e1954b5c6d0
|
||||||
// pending-parity-case: LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_NoRestartConfigured_ReturnsNull::test 59a4b050a79659ccaf0fff13b750d634d803ed7b9e4940cbad676c1bdc04a5fc
|
// pending-parity-case: LibreMetaverse.Tests/RegionScheduleTests.cs::RegionScheduleTests.GetRegionRestartScheduleAsync_NoRestartConfigured_ReturnsNull::test 59a4b050a79659ccaf0fff13b750d634d803ed7b9e4940cbad676c1bdc04a5fc
|
||||||
@@ -1178,12 +1175,6 @@
|
|||||||
// pending-parity-case: LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_Face32_RepeatU_IsPreserved::test 58e80815263025ec54cd15e3c9a42771f5e55c81e9acb212a0f163faef9fd499
|
// pending-parity-case: LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_Face32_RepeatU_IsPreserved::test 58e80815263025ec54cd15e3c9a42771f5e55c81e9acb212a0f163faef9fd499
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_Face32_RepeatV_IsPreserved::test fbeb1fdd584a26576b6f1ba653b2995d1a6d6bccc2c1dc51e46aa9f211b78724
|
// pending-parity-case: LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_Face32_RepeatV_IsPreserved::test fbeb1fdd584a26576b6f1ba653b2995d1a6d6bccc2c1dc51e46aa9f211b78724
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_AllFaces_TextureIDs_AllPreserved::test 5e5a390af8deff77ef80f751735456541f24d7e27666557d50d99065cc3ba6a4
|
// pending-parity-case: LibreMetaverse.Tests/TextureEntryTests.cs::TextureEntryTests.RoundTrip_AllFaces_TextureIDs_AllPreserved::test 5e5a390af8deff77ef80f751735456541f24d7e27666557d50d99065cc3ba6a4
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.UUIDs::test 4f95d48c474bbd824254196dd605051773c711614bf661b5aa996054b6c98967
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.Vector3ApproxEquals::test 1438175bb0c0bd8b17dd878e8fb95fb0dba82abbab71882f2ceb39ec554189d9
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.VectorCasting::test 27c0a4b8402ef66f11dca075d8c1a0f0b647ccef9c2803125dde6ca292951cd4
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.Quaternions::test 071cf3ef6932e093c0fd09fe461a738e75af905707fce9a321b8f08dd89c09dd
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.TestMatrix::test 5d5ccc8b9ea1741b013fd945e42ba7e6511322fdce51998e358d42c1736457e3
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.FloatsToTerseStrings::test ce34cdfe106d5dadfa82056e7aa7690d2da748c7e753b9d2a2ad682d86327def
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.BitUnpacking::test 741470d770a0a71853d84e26abaf927fc7dc385dedf0d7de87f63e7a22cb4dd7
|
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.BitUnpacking::test 741470d770a0a71853d84e26abaf927fc7dc385dedf0d7de87f63e7a22cb4dd7
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.BitPacking::test fe3cac4216b588667d56b35496a803097dbc39f84c7a82fd95aa101836588948
|
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.BitPacking::test fe3cac4216b588667d56b35496a803097dbc39f84c7a82fd95aa101836588948
|
||||||
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.LLSDTerseParsing::test c5fcc05c15fa60c43cd40f5fc2b1349d9fbd1f5bb3537d8b04e91f37302e77f1
|
// pending-parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.LLSDTerseParsing::test c5fcc05c15fa60c43cd40f5fc2b1349d9fbd1f5bb3537d8b04e91f37302e77f1
|
||||||
@@ -1193,14 +1184,6 @@
|
|||||||
// pending-parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_NoCapability_ReturnsNullWithoutRequest::test 2bc1ad18b159c5d62a18d2208ed3cf3c88d3f666a0e0dad8730778cd22b59eda
|
// pending-parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_NoCapability_ReturnsNullWithoutRequest::test 2bc1ad18b159c5d62a18d2208ed3cf3c88d3f666a0e0dad8730778cd22b59eda
|
||||||
// pending-parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_MetadataResponseMissingUploader_ReturnsNullWithoutSecondRequest::test 8db3eddf1204ad795e9d5ef15365f422f96191a8b4c24ef3393b03c10d92d662
|
// pending-parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_MetadataResponseMissingUploader_ReturnsNullWithoutSecondRequest::test 8db3eddf1204ad795e9d5ef15365f422f96191a8b4c24ef3393b03c10d92d662
|
||||||
// pending-parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_UploadDoesNotComplete_ReturnsNull::test e870f6913e3f45676ce490069930427e6c625072fc1d6ebbf16f503be51df4ae
|
// pending-parity-case: LibreMetaverse.Tests/UploadThumbnailTests.cs::UploadThumbnailTests.UploadThumbnailAsync_UploadDoesNotComplete_ReturnsNull::test e870f6913e3f45676ce490069930427e6c625072fc1d6ebbf16f503be51df4ae
|
||||||
// pending-parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.FileHelper_SanitizeAndSafeNames::test 770d1cb751c4b8290c9443bcb4a91d17703628a157cc428c607a7d36ae0af985
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.ObservableDictionary_Events_FireOnAddRemoveAndClear::test 579412c3c839e1fe5b44cf956f8d329a15d4e05c05778b4e6e3ff9b7d2fb7607
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.EventSubscriptionHelper_WaitForEventAndAsync::test bab59e0caf1630edda9a2a6daecca95cd1a28f189fdde01b1b6afee4cd96d8cb
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.Repeat_Interval_ExecutesAndCancels::test 43250eb6d7799ca3c00e51810b3e04d9a874bfdeafd77af6f7b78f8f6c73ff77
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.NameValue_ParseAndToString::test f779a81d286c0028ea202bab00f8db0d1bbaea611003458918a9ec9a24207557
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.Helpers_SplitAndFloatToTerseString::test aa2c378f56cfd04d6d4cfa50cd3efafd2b2d479d681336d72fbb9d5ec5c363e6
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.DisposalHelper_SafeDisposeAndUsing::test 433ebbfeb69eeb7ceaac86c4b3637468152a1f5a9f4c12ea8d7a74e1cb0c4fec
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/UtilsConversionsTests.cs::UtilsConversionsTests.StringToBytes::test 0bef42801dc2a50e132b05440424c44da54b53c853708ee2c0ec9799dbe0e8b2
|
|
||||||
// pending-parity-case: LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeLLSDSample::test 2495e7d5c414b59962f03282c51fe1c0d5de350b51c1bdfcee9ced7c32acbe4d
|
// pending-parity-case: LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeLLSDSample::test 2495e7d5c414b59962f03282c51fe1c0d5de350b51c1bdfcee9ced7c32acbe4d
|
||||||
// pending-parity-case: LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeNoDTD::test 9bc25ce11695355a0b81622301db687495d414c9a293505f6d421f27ac24eb70
|
// pending-parity-case: LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeNoDTD::test 9bc25ce11695355a0b81622301db687495d414c9a293505f6d421f27ac24eb70
|
||||||
// pending-parity-case: LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeSillyPI::test 08f94779e33e1dff4bd88eb75c7e032947dfb75f9ac7b14432847e705f08176d
|
// pending-parity-case: LibreMetaverse.Tests/XmlLLSDTests.cs::XmlSDTests.DeserializeSillyPI::test 08f94779e33e1dff4bd88eb75c7e032947dfb75f9ac7b14432847e705f08176d
|
||||||
|
|||||||
670
tests/compat/tests/types_utilities.rs
Normal file
670
tests/compat/tests/types_utilities.rs
Normal file
@@ -0,0 +1,670 @@
|
|||||||
|
#![allow(clippy::cast_possible_truncation, clippy::float_cmp)]
|
||||||
|
|
||||||
|
use libremetaverse::{
|
||||||
|
DictionaryEventAction, DisposalHelper, EventSubscription, EventSubscriptionHelper, FileHelper,
|
||||||
|
Helpers, NameValue, NameValueClassType, NameValueSendtoType, NameValueValueType,
|
||||||
|
ObservableDictionary, PositionHelper, Repeat, Simulator, threading::OptimisticReaderWriterLock,
|
||||||
|
};
|
||||||
|
use libremetaverse_compat_tests::{assert_close, block_on};
|
||||||
|
use libremetaverse_types::compat::{
|
||||||
|
CancellationTokenSource, Close, EventHandler, ExternalError, Guid, Object, Utf16CodeUnit,
|
||||||
|
};
|
||||||
|
use libremetaverse_types::{Matrix4, Quaternion, UUID, Utils, Vector3, Vector3d};
|
||||||
|
use std::cell::Cell;
|
||||||
|
use std::sync::atomic::{AtomicBool, AtomicI32, Ordering};
|
||||||
|
use std::sync::{Arc, Barrier, Mutex, mpsc};
|
||||||
|
use std::time::{Duration, Instant};
|
||||||
|
|
||||||
|
fn vector3(x: f32, y: f32, z: f32) -> Vector3 {
|
||||||
|
Vector3::new_with_single_single_single(x, y, z).expect("Vector3 constructor")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn vector3d(x: f64, y: f64, z: f64) -> Vector3d {
|
||||||
|
Vector3d::new_with_double_double_double(x, y, z).expect("Vector3d constructor")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn quaternion(x: f32, y: f32, z: f32, w: f32) -> Quaternion {
|
||||||
|
Quaternion::new_with_single_single_single_single(x, y, z, w).expect("Quaternion constructor")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn matrix(values: [f32; 16]) -> Matrix4 {
|
||||||
|
Matrix4::new_with_single_single_single_single_single_single_single_single_single_single_single_single_single_single_single_single(
|
||||||
|
values[0], values[1], values[2], values[3], values[4], values[5], values[6],
|
||||||
|
values[7], values[8], values[9], values[10], values[11], values[12], values[13],
|
||||||
|
values[14], values[15],
|
||||||
|
)
|
||||||
|
.expect("Matrix4 constructor")
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.UUIDs::test 4f95d48c474bbd824254196dd605051773c711614bf661b5aa996054b6c98967 translated
|
||||||
|
#[test]
|
||||||
|
fn uuids() {
|
||||||
|
let uuid = UUID::default();
|
||||||
|
let bytes = uuid.get_bytes().expect("UUID.GetBytes");
|
||||||
|
assert!(bytes.len() >= 16);
|
||||||
|
for byte in &bytes[..16] {
|
||||||
|
assert_eq!(*byte, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
let bytes_with_tail = vec![
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
|
||||||
|
0x0f, 0xff, 0xff,
|
||||||
|
];
|
||||||
|
let exact_bytes = vec![
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
|
||||||
|
0x0f,
|
||||||
|
];
|
||||||
|
let a = UUID::new_with_bytes_int32(bytes_with_tail, 0).expect("UUID byte constructor");
|
||||||
|
let b = UUID::new_with_bytes_int32(exact_bytes.clone(), 0).expect("UUID byte constructor");
|
||||||
|
assert!(a.equals_with_uuid(b), "UUID comparison operator failed");
|
||||||
|
|
||||||
|
let text = "00010203-0405-0607-0809-0a0b0c0d0e0f";
|
||||||
|
let a = UUID::new_with_bytes_int32(exact_bytes, 0).expect("UUID byte constructor");
|
||||||
|
let b = UUID::new_with_string(text.to_owned()).expect("UUID string constructor");
|
||||||
|
assert!(
|
||||||
|
a.equals_with_uuid(b),
|
||||||
|
"UUID hyphenated string constructor failed"
|
||||||
|
);
|
||||||
|
assert!(a.equals_with_uuid(b));
|
||||||
|
assert!(a.equals_with_uuid(UUID::try_from(text.to_owned())));
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.Vector3ApproxEquals::test 1438175bb0c0bd8b17dd878e8fb95fb0dba82abbab71882f2ceb39ec554189d9 translated
|
||||||
|
#[test]
|
||||||
|
fn vector3_approx_equals() {
|
||||||
|
let mut a = vector3(1.0, 0.0, 0.0);
|
||||||
|
let b = vector3(0.0, 0.0, 0.0);
|
||||||
|
assert!(!a.approx_equals(b, 0.9).expect("ApproxEquals (1)"));
|
||||||
|
assert!(a.approx_equals(b, 1.0).expect("ApproxEquals (2)"));
|
||||||
|
|
||||||
|
a = vector3(-1.0, 0.0, 0.0);
|
||||||
|
let b = vector3(1.0, 0.0, 0.0);
|
||||||
|
assert!(!a.approx_equals(b, 1.9).expect("ApproxEquals (3)"));
|
||||||
|
assert!(a.approx_equals(b, 2.0).expect("ApproxEquals (4)"));
|
||||||
|
|
||||||
|
a = vector3(0.0, -1.0, 0.0);
|
||||||
|
let b = vector3(0.0, -1.1, 0.0);
|
||||||
|
assert!(!a.approx_equals(b, 0.09).expect("ApproxEquals (5)"));
|
||||||
|
assert!(a.approx_equals(b, 0.11).expect("ApproxEquals (6)"));
|
||||||
|
|
||||||
|
a = vector3(0.0, 0.0, 0.00001);
|
||||||
|
let mut b = vector3(0.0, 0.0, 0.0);
|
||||||
|
assert!(
|
||||||
|
!b.approx_equals(a, f32::from_bits(1))
|
||||||
|
.expect("ApproxEquals epsilon")
|
||||||
|
);
|
||||||
|
assert!(b.approx_equals(a, 0.0001).expect("ApproxEquals (7)"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.VectorCasting::test 27c0a4b8402ef66f11dca075d8c1a0f0b647ccef9c2803125dde6ca292951cd4 translated
|
||||||
|
#[test]
|
||||||
|
fn vector_casting() {
|
||||||
|
for (label, value) in [
|
||||||
|
("1.0", 1.0),
|
||||||
|
("1.1", 1.1),
|
||||||
|
("1.01", 1.01),
|
||||||
|
("1.001", 1.001),
|
||||||
|
("1.0001", 1.0001),
|
||||||
|
("1.00001", 1.00001),
|
||||||
|
("1.000001", 1.000_001),
|
||||||
|
("1.0000001", 1.000_000_1),
|
||||||
|
("1.00000001", 1.000_000_01),
|
||||||
|
] {
|
||||||
|
let narrowed = value as f32;
|
||||||
|
let no_precision_loss = value == f64::from(narrowed);
|
||||||
|
let a = vector3(narrowed, narrowed, narrowed);
|
||||||
|
let b = vector3d(value, value, value);
|
||||||
|
let c = Vector3::try_from(b);
|
||||||
|
let d = Vector3d::from(a);
|
||||||
|
|
||||||
|
if no_precision_loss {
|
||||||
|
eprintln!(
|
||||||
|
"Unsuitable test value used- test number should have precision loss when cast to float ({label})."
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
assert!(
|
||||||
|
!b.equals_with_vector3d(d),
|
||||||
|
"explicit double-to-float cast unexpectedly retained precision for {label}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
assert!(
|
||||||
|
a.equals_with_vector3(c),
|
||||||
|
"explicit Vector3d-to-Vector3 cast differed for {label}"
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
Vector3d::eq(Vector3d::from(a), d),
|
||||||
|
"implicit Vector3-to-Vector3d cast differed for {label}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.Quaternions::test 071cf3ef6932e093c0fd09fe461a738e75af905707fce9a321b8f08dd89c09dd translated
|
||||||
|
#[test]
|
||||||
|
fn quaternions() {
|
||||||
|
let mut a = quaternion(1.0, 0.0, 0.0, 0.0);
|
||||||
|
let mut b = quaternion(1.0, 0.0, 0.0, 0.0);
|
||||||
|
assert!(a.equals_with_quaternion(b), "Quaternion comparison failed");
|
||||||
|
|
||||||
|
let mut expected = quaternion(0.0, 0.0, 0.0, -1.0);
|
||||||
|
let mut result = Quaternion::mul_with_quaternion_quaternion(a, b);
|
||||||
|
assert!(result.equals_with_quaternion(expected));
|
||||||
|
|
||||||
|
a = quaternion(1.0, 0.0, 0.0, 0.0);
|
||||||
|
b = quaternion(0.0, 1.0, 0.0, 0.0);
|
||||||
|
expected = quaternion(0.0, 0.0, 1.0, 0.0);
|
||||||
|
result = Quaternion::mul_with_quaternion_quaternion(a, b);
|
||||||
|
assert!(result.equals_with_quaternion(expected));
|
||||||
|
|
||||||
|
a = quaternion(0.0, 0.0, 1.0, 0.0);
|
||||||
|
b = quaternion(0.0, 1.0, 0.0, 0.0);
|
||||||
|
expected = quaternion(-1.0, 0.0, 0.0, 0.0);
|
||||||
|
result = Quaternion::mul_with_quaternion_quaternion(a, b);
|
||||||
|
assert!(result.equals_with_quaternion(expected));
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.TestMatrix::test 5d5ccc8b9ea1741b013fd945e42ba7e6511322fdce51998e358d42c1736457e3 translated
|
||||||
|
#[test]
|
||||||
|
fn test_matrix() {
|
||||||
|
let mut value = matrix([
|
||||||
|
0.0, 0.0, 74.0, 1.0, 0.0, 435.0, 0.0, 1.0, 345.0, 0.0, 34.0, 1.0, 0.0, 0.0, 0.0, 0.0,
|
||||||
|
]);
|
||||||
|
assert_close(
|
||||||
|
f64::from(value.determinant().expect("Matrix4 determinant")),
|
||||||
|
0.0,
|
||||||
|
0.001,
|
||||||
|
);
|
||||||
|
let identity = Matrix4::identity();
|
||||||
|
assert!(identity.equals_with_matrix4(
|
||||||
|
Matrix4::inverse(Matrix4::identity()).expect("Matrix4 inverse identity")
|
||||||
|
));
|
||||||
|
|
||||||
|
value = matrix([
|
||||||
|
1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0,
|
||||||
|
]);
|
||||||
|
let expected = matrix([
|
||||||
|
0.0, 1.0, -1.0, 0.0, 1.0, -1.0, 1.0, 0.0, -1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0,
|
||||||
|
]);
|
||||||
|
assert!(
|
||||||
|
Matrix4::inverse(value)
|
||||||
|
.expect("Matrix4 inverse")
|
||||||
|
.equals_with_matrix4(expected)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/TypeTests.cs::TypeTests.FloatsToTerseStrings::test ce34cdfe106d5dadfa82056e7aa7690d2da748c7e753b9d2a2ad682d86327def translated
|
||||||
|
#[test]
|
||||||
|
fn floats_to_terse_strings() {
|
||||||
|
let mut value = 1.20;
|
||||||
|
let mut expected = "1.2";
|
||||||
|
let mut actual = Helpers::float_to_terse_string(value).expect("FloatToTerseString");
|
||||||
|
assert_eq!(actual, expected);
|
||||||
|
|
||||||
|
value = 24.00;
|
||||||
|
expected = "24";
|
||||||
|
actual = Helpers::float_to_terse_string(value).expect("FloatToTerseString");
|
||||||
|
assert_eq!(actual, expected);
|
||||||
|
|
||||||
|
value = -0.59;
|
||||||
|
expected = "-.59";
|
||||||
|
actual = Helpers::float_to_terse_string(value).expect("FloatToTerseString");
|
||||||
|
assert_eq!(actual, expected);
|
||||||
|
|
||||||
|
value = 0.59;
|
||||||
|
expected = ".59";
|
||||||
|
actual = Helpers::float_to_terse_string(value).expect("FloatToTerseString");
|
||||||
|
assert_eq!(actual, expected);
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.FileHelper_SanitizeAndSafeNames::test 770d1cb751c4b8290c9443bcb4a91d17703628a157cc428c607a7d36ae0af985 translated
|
||||||
|
#[test]
|
||||||
|
fn file_helper_sanitize_and_safe_names() {
|
||||||
|
let safe = FileHelper::safe_file_name("inva:lid/fi*le?.txt".to_owned())
|
||||||
|
.expect("FileHelper.SafeFileName");
|
||||||
|
assert!(!safe.is_empty());
|
||||||
|
assert!(!safe.contains(':'));
|
||||||
|
assert!(
|
||||||
|
!FileHelper::safe_dir_name("path|with?bad".to_owned())
|
||||||
|
.expect("FileHelper.SafeDirName")
|
||||||
|
.contains('|')
|
||||||
|
);
|
||||||
|
|
||||||
|
let sanitized = FileHelper::sanitize(
|
||||||
|
"abcxyz".to_owned(),
|
||||||
|
vec![Utf16CodeUnit('a' as u16), Utf16CodeUnit('b' as u16)],
|
||||||
|
Some(Utf16CodeUnit('-' as u16)),
|
||||||
|
)
|
||||||
|
.expect("FileHelper.Sanitize");
|
||||||
|
assert_eq!(sanitized, "--cxyz");
|
||||||
|
|
||||||
|
let mut first = None;
|
||||||
|
let mut last = None;
|
||||||
|
assert!(FileHelper::try_parse_two_names(
|
||||||
|
"First Last".to_owned(),
|
||||||
|
&mut first,
|
||||||
|
&mut last
|
||||||
|
));
|
||||||
|
assert_eq!(first.as_deref(), Some("First"));
|
||||||
|
assert_eq!(last.as_deref(), Some("Last"));
|
||||||
|
assert!(!FileHelper::try_parse_two_names(
|
||||||
|
" Too Many Parts Extra".to_owned(),
|
||||||
|
&mut first,
|
||||||
|
&mut last
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.ObservableDictionary_Events_FireOnAddRemoveAndClear::test 579412c3c839e1fe5b44cf956f8d329a15d4e05c05778b4e6e3ff9b7d2fb7607 translated
|
||||||
|
#[test]
|
||||||
|
fn observable_dictionary_events_fire_on_add_remove_and_clear() {
|
||||||
|
let mut dictionary = ObservableDictionary::<String, i32>::new_with_constructor()
|
||||||
|
.expect("ObservableDictionary constructor");
|
||||||
|
let adds = Arc::new(AtomicI32::new(0));
|
||||||
|
let removes = Arc::new(AtomicI32::new(0));
|
||||||
|
let changes = Arc::new(AtomicI32::new(0));
|
||||||
|
|
||||||
|
let count = Arc::clone(&adds);
|
||||||
|
dictionary
|
||||||
|
.add_delegate(
|
||||||
|
DictionaryEventAction::Add,
|
||||||
|
Arc::new(move |action, _entry| {
|
||||||
|
if action == DictionaryEventAction::Add {
|
||||||
|
count.fetch_add(1, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.expect("add Add callback");
|
||||||
|
let count = Arc::clone(&removes);
|
||||||
|
dictionary
|
||||||
|
.add_delegate(
|
||||||
|
DictionaryEventAction::Remove,
|
||||||
|
Arc::new(move |action, _entry| {
|
||||||
|
if action == DictionaryEventAction::Remove {
|
||||||
|
count.fetch_add(1, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.expect("add Remove callback");
|
||||||
|
let count = Arc::clone(&changes);
|
||||||
|
dictionary
|
||||||
|
.add_delegate(
|
||||||
|
DictionaryEventAction::Change,
|
||||||
|
Arc::new(move |action, _entry| {
|
||||||
|
if action == DictionaryEventAction::Change {
|
||||||
|
count.fetch_add(1, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.expect("add Change callback");
|
||||||
|
|
||||||
|
dictionary
|
||||||
|
.add("one".to_owned(), Some(1))
|
||||||
|
.expect("dictionary add one");
|
||||||
|
assert_eq!(adds.load(Ordering::SeqCst), 1);
|
||||||
|
dictionary.set_item(Some("one".to_owned()), Some(2));
|
||||||
|
assert!(adds.load(Ordering::SeqCst) >= 1);
|
||||||
|
assert!(
|
||||||
|
dictionary
|
||||||
|
.remove("one".to_owned())
|
||||||
|
.expect("dictionary remove one")
|
||||||
|
);
|
||||||
|
assert_eq!(removes.load(Ordering::SeqCst), 1);
|
||||||
|
dictionary
|
||||||
|
.add("a".to_owned(), Some(1))
|
||||||
|
.expect("dictionary add a");
|
||||||
|
dictionary
|
||||||
|
.add("b".to_owned(), Some(2))
|
||||||
|
.expect("dictionary add b");
|
||||||
|
dictionary.clear().expect("dictionary clear");
|
||||||
|
assert!(removes.load(Ordering::SeqCst) >= 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.EventSubscriptionHelper_WaitForEventAndAsync::test bab59e0caf1630edda9a2a6daecca95cd1a28f189fdde01b1b6afee4cd96d8cb translated
|
||||||
|
#[test]
|
||||||
|
fn event_subscription_helper_wait_for_event_and_async() {
|
||||||
|
type UnitHandler = EventHandler<Option<()>>;
|
||||||
|
|
||||||
|
let event = Arc::new(Mutex::new(None::<UnitHandler>));
|
||||||
|
let subscribed_event = Arc::clone(&event);
|
||||||
|
let unsubscribed_event = Arc::clone(&event);
|
||||||
|
let fired_event = Arc::clone(&event);
|
||||||
|
let (subscribed_tx, subscribed_rx) = mpsc::sync_channel(0);
|
||||||
|
let fire_task = std::thread::spawn(move || {
|
||||||
|
if subscribed_rx.recv_timeout(Duration::from_secs(5)).is_ok()
|
||||||
|
&& let Some(handler) = fired_event.lock().expect("event state").as_ref()
|
||||||
|
{
|
||||||
|
handler(Some(()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let result =
|
||||||
|
EventSubscriptionHelper::wait_for_event_with_action_action_func_func_int32_t_result::<
|
||||||
|
(),
|
||||||
|
i32,
|
||||||
|
>(
|
||||||
|
Box::new(move |handler| {
|
||||||
|
*subscribed_event.lock().expect("event state") = Some(handler);
|
||||||
|
subscribed_tx.send(()).expect("subscription signal");
|
||||||
|
}),
|
||||||
|
Box::new(move |_handler| {
|
||||||
|
*unsubscribed_event.lock().expect("event state") = None;
|
||||||
|
}),
|
||||||
|
Box::new(|_event| true),
|
||||||
|
Box::new(|_event| Some(123)),
|
||||||
|
5_000,
|
||||||
|
Some(-1),
|
||||||
|
)
|
||||||
|
.expect("EventSubscriptionHelper.WaitForEvent");
|
||||||
|
assert_eq!(result, Some(123));
|
||||||
|
fire_task.join().expect("event fire task");
|
||||||
|
|
||||||
|
let event = Arc::new(Mutex::new(None::<UnitHandler>));
|
||||||
|
let subscribed_event = Arc::clone(&event);
|
||||||
|
let unsubscribed_event = Arc::clone(&event);
|
||||||
|
let fired_event = Arc::clone(&event);
|
||||||
|
let (subscribed_tx, subscribed_rx) = mpsc::sync_channel(0);
|
||||||
|
let fire_task = std::thread::spawn(move || {
|
||||||
|
if subscribed_rx.recv_timeout(Duration::from_secs(5)).is_ok()
|
||||||
|
&& let Some(handler) = fired_event.lock().expect("event state").as_ref()
|
||||||
|
{
|
||||||
|
handler(Some(()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let result = block_on(
|
||||||
|
EventSubscriptionHelper::wait_for_event_with_action_action_func_func_int32_cancellation_token_t_result::<(), Guid>(
|
||||||
|
Box::new(move |handler| {
|
||||||
|
*subscribed_event.lock().expect("event state") = Some(handler);
|
||||||
|
subscribed_tx.send(()).expect("subscription signal");
|
||||||
|
}),
|
||||||
|
Box::new(move |_handler| {
|
||||||
|
*unsubscribed_event.lock().expect("event state") = None;
|
||||||
|
}),
|
||||||
|
Box::new(|_event| true),
|
||||||
|
Box::new(|_event| Some(Guid([0; 16]))),
|
||||||
|
5_000,
|
||||||
|
None,
|
||||||
|
Some(Guid([1; 16])),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.expect("EventSubscriptionHelper.WaitForEventAsync");
|
||||||
|
assert_eq!(result, Some(Guid([0; 16])));
|
||||||
|
fire_task.join().expect("async event fire task");
|
||||||
|
|
||||||
|
let event = Arc::new(Mutex::new(None::<UnitHandler>));
|
||||||
|
let subscribed_event = Arc::clone(&event);
|
||||||
|
let unsubscribed_event = Arc::clone(&event);
|
||||||
|
let subscription = EventSubscription::<()>::new(
|
||||||
|
Box::new(move |handler| {
|
||||||
|
*subscribed_event.lock().expect("event state") = Some(handler);
|
||||||
|
}),
|
||||||
|
Box::new(move |_handler| {
|
||||||
|
*unsubscribed_event.lock().expect("event state") = None;
|
||||||
|
}),
|
||||||
|
Arc::new(|_event| {}),
|
||||||
|
)
|
||||||
|
.expect("EventSubscription constructor");
|
||||||
|
subscription
|
||||||
|
.dispose()
|
||||||
|
.expect("EventSubscription disposable close");
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.Repeat_Interval_ExecutesAndCancels::test 43250eb6d7799ca3c00e51810b3e04d9a874bfdeafd77af6f7b78f8f6c73ff77 translated
|
||||||
|
#[test]
|
||||||
|
fn repeat_interval_executes_and_cancels() {
|
||||||
|
let count = Arc::new(AtomicI32::new(0));
|
||||||
|
let action_count = Arc::clone(&count);
|
||||||
|
let (executed_tx, executed_rx) = mpsc::sync_channel(1);
|
||||||
|
let cancellation = CancellationTokenSource::new();
|
||||||
|
let token = cancellation.token();
|
||||||
|
let (task_tx, task_rx) = mpsc::sync_channel(1);
|
||||||
|
let task = std::thread::spawn(move || {
|
||||||
|
let result = block_on(
|
||||||
|
Repeat::interval_with_time_span_action_cancellation_token_boolean(
|
||||||
|
Duration::from_millis(50),
|
||||||
|
Box::new(move || {
|
||||||
|
action_count.fetch_add(1, Ordering::SeqCst);
|
||||||
|
let _ = executed_tx.try_send(());
|
||||||
|
}),
|
||||||
|
token,
|
||||||
|
Some(true),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
task_tx.send(result).expect("repeat task result");
|
||||||
|
});
|
||||||
|
|
||||||
|
let started = Instant::now();
|
||||||
|
loop {
|
||||||
|
if let Ok(result) = task_rx.try_recv() {
|
||||||
|
result.expect("Repeat.Interval");
|
||||||
|
panic!("Repeat.Interval completed before cancellation");
|
||||||
|
}
|
||||||
|
if executed_rx.recv_timeout(Duration::from_millis(10)).is_ok() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
assert!(
|
||||||
|
started.elapsed() < Duration::from_secs(30),
|
||||||
|
"Expected at least 1 execution within 30s, but got {}",
|
||||||
|
count.load(Ordering::SeqCst)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellation.cancel();
|
||||||
|
if let Ok(result) = task_rx.recv_timeout(Duration::from_secs(2)) {
|
||||||
|
result.expect("Repeat.Interval");
|
||||||
|
task.join().expect("repeat task");
|
||||||
|
}
|
||||||
|
assert!(
|
||||||
|
count.load(Ordering::SeqCst) >= 1,
|
||||||
|
"Expected at least 1 execution"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.NameValue_ParseAndToString::test f779a81d286c0028ea202bab00f8db0d1bbaea611003458918a9ec9a24207557 translated
|
||||||
|
#[test]
|
||||||
|
fn name_value_parse_and_to_string() {
|
||||||
|
let value = NameValue::new_with_string("greeting STRING R S Hello".to_owned())
|
||||||
|
.expect("NameValue string constructor");
|
||||||
|
assert_eq!(value.name, "greeting");
|
||||||
|
assert_eq!(value.value, Some(Object::from("Hello")));
|
||||||
|
|
||||||
|
let values = vec![
|
||||||
|
NameValue::new_with_string_value_type_class_type_sendto_type_object(
|
||||||
|
"n1".to_owned(),
|
||||||
|
NameValueValueType::String,
|
||||||
|
NameValueClassType::ReadOnly,
|
||||||
|
NameValueSendtoType::Sim,
|
||||||
|
Object::from("v1"),
|
||||||
|
)
|
||||||
|
.expect("NameValue component constructor"),
|
||||||
|
];
|
||||||
|
let rendered = NameValue::name_values_to_string(values).expect("NameValuesToString");
|
||||||
|
assert!(rendered.contains("n1") && rendered.contains("v1"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.Helpers_SplitAndFloatToTerseString::test aa2c378f56cfd04d6d4cfa50cd3efafd2b2d479d681336d72fbb9d5ec5c363e6 translated
|
||||||
|
#[test]
|
||||||
|
fn helpers_split_and_float_to_terse_string() {
|
||||||
|
let chunks: Vec<_> = Helpers::split_by("abcdef".to_owned(), 2)
|
||||||
|
.expect("SplitBy")
|
||||||
|
.collect();
|
||||||
|
assert_eq!(chunks, ["ab", "cd", "ef"]);
|
||||||
|
assert_eq!(
|
||||||
|
Helpers::float_to_terse_string(0.0).expect("FloatToTerseString zero"),
|
||||||
|
".00"
|
||||||
|
);
|
||||||
|
assert!(
|
||||||
|
Helpers::float_to_terse_string(1.2300)
|
||||||
|
.expect("FloatToTerseString 1.23")
|
||||||
|
.contains("1.23")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ThrowOnClose {
|
||||||
|
disposed: Arc<AtomicBool>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Close for ThrowOnClose {
|
||||||
|
fn close(&mut self) -> Result<(), ExternalError> {
|
||||||
|
self.disposed.store(true, Ordering::SeqCst);
|
||||||
|
Err(ExternalError("boom".to_owned()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct DisposableFlag(Cell<i32>);
|
||||||
|
|
||||||
|
impl Close for DisposableFlag {
|
||||||
|
fn close(&mut self) -> Result<(), ExternalError> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/UtilUnitTests.cs::UtilUnitTests.DisposalHelper_SafeDisposeAndUsing::test 433ebbfeb69eeb7ceaac86c4b3637468152a1f5a9f4c12ea8d7a74e1cb0c4fec translated
|
||||||
|
#[test]
|
||||||
|
fn disposal_helper_safe_dispose_and_using() {
|
||||||
|
let disposed = Arc::new(AtomicBool::new(false));
|
||||||
|
let logged = Arc::new(Mutex::new(None::<String>));
|
||||||
|
let logged_message = Arc::clone(&logged);
|
||||||
|
DisposalHelper::safe_dispose(
|
||||||
|
Box::new(ThrowOnClose {
|
||||||
|
disposed: Arc::clone(&disposed),
|
||||||
|
}),
|
||||||
|
Some("test".to_owned()),
|
||||||
|
Some(Box::new(move |message, _error| {
|
||||||
|
*logged_message.lock().expect("logger state") = Some(message);
|
||||||
|
})),
|
||||||
|
)
|
||||||
|
.expect("DisposalHelper.SafeDispose");
|
||||||
|
assert!(disposed.load(Ordering::SeqCst));
|
||||||
|
assert!(logged.lock().expect("logger state").is_some());
|
||||||
|
|
||||||
|
let result = DisposalHelper::using_with_func_func_3fbb9598(
|
||||||
|
Box::new(|| DisposableFlag(Cell::new(0))),
|
||||||
|
Box::new(|value| {
|
||||||
|
value.0.set(5);
|
||||||
|
Some(value.0.get())
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
.expect("DisposalHelper.Using");
|
||||||
|
assert_eq!(result, Some(5));
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/PositionHelperTests.cs::PositionHelperTests.ToGlobalAndLocalPosition_RoundTrip::test 695c6a640e5353e02def9a1b4a1c1eabb37a8543c13466dff570f58d847e7772 translated
|
||||||
|
#[test]
|
||||||
|
fn to_global_and_local_position_round_trip() {
|
||||||
|
let global_x = 512 * Simulator::DEFAULT_REGION_SIZE_X;
|
||||||
|
let global_y = 1024 * Simulator::DEFAULT_REGION_SIZE_Y;
|
||||||
|
let handle = Utils::u_ints_to_long(global_x, global_y).expect("Utils.UIntsToLong");
|
||||||
|
let local = vector3(10.5, 20.25, 5.0);
|
||||||
|
let global = PositionHelper::to_global_position(handle, local).expect("ToGlobalPosition");
|
||||||
|
assert_close(global.x, f64::from(global_x) + f64::from(local.x), 0.0001);
|
||||||
|
assert_close(global.y, f64::from(global_y) + f64::from(local.y), 0.0001);
|
||||||
|
assert_close(global.z, f64::from(local.z), 0.0001);
|
||||||
|
|
||||||
|
let back = PositionHelper::to_local_position(handle, global).expect("ToLocalPosition");
|
||||||
|
assert_close(f64::from(back.x), f64::from(local.x), 0.0001);
|
||||||
|
assert_close(f64::from(back.y), f64::from(local.y), 0.0001);
|
||||||
|
assert_close(f64::from(back.z), f64::from(local.z), 0.0001);
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/PositionHelperTests.cs::PositionHelperTests.FormatCoordinates_FormatsCorrectly::test fe4256d00dab5cc2de602b7b27442cac627a5956c4ce79c05d92de830f6fc5d2 translated
|
||||||
|
#[test]
|
||||||
|
fn format_coordinates_formats_correctly() {
|
||||||
|
assert_eq!(
|
||||||
|
PositionHelper::format_coordinates(None, None, None).expect("FormatCoordinates()"),
|
||||||
|
""
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
PositionHelper::format_coordinates(Some(Some(10)), None, None)
|
||||||
|
.expect("FormatCoordinates(10)"),
|
||||||
|
" (10)"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
PositionHelper::format_coordinates(Some(Some(10)), Some(Some(20)), None)
|
||||||
|
.expect("FormatCoordinates(10, 20)"),
|
||||||
|
" (10,20)"
|
||||||
|
);
|
||||||
|
assert_eq!(
|
||||||
|
PositionHelper::format_coordinates(Some(Some(10)), Some(Some(20)), Some(Some(30)))
|
||||||
|
.expect("FormatCoordinates(10, 20, 30)"),
|
||||||
|
" (10,20,30)"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/ReaderWriterLockTests.cs::ReaderWriterLockTests.MultipleReadersOneWriter_ReaderConcurrencyAndWriterExclusion::test bf63804480951667455038244228f77c30454a365b496f062051f7b34e7b2618 translated
|
||||||
|
#[test]
|
||||||
|
fn multiple_readers_one_writer_reader_concurrency_and_writer_exclusion() {
|
||||||
|
const READER_COUNT: usize = 5;
|
||||||
|
let lock = Arc::new(OptimisticReaderWriterLock::new().expect("lock constructor"));
|
||||||
|
let readers_ready = Arc::new(Barrier::new(READER_COUNT + 1));
|
||||||
|
let start_gate = Arc::new(Barrier::new(READER_COUNT + 1));
|
||||||
|
let start_release = Arc::new(Barrier::new(READER_COUNT + 1));
|
||||||
|
let current_readers = Arc::new(AtomicI32::new(0));
|
||||||
|
let max_concurrent_readers = Arc::new(AtomicI32::new(0));
|
||||||
|
let (entered_tx, entered_rx) = mpsc::channel();
|
||||||
|
let (exited_tx, exited_rx) = mpsc::channel();
|
||||||
|
let mut readers = Vec::new();
|
||||||
|
|
||||||
|
for _ in 0..READER_COUNT {
|
||||||
|
let lock = Arc::clone(&lock);
|
||||||
|
let readers_ready = Arc::clone(&readers_ready);
|
||||||
|
let start_gate = Arc::clone(&start_gate);
|
||||||
|
let start_release = Arc::clone(&start_release);
|
||||||
|
let current_readers = Arc::clone(¤t_readers);
|
||||||
|
let max_concurrent_readers = Arc::clone(&max_concurrent_readers);
|
||||||
|
let entered_tx = entered_tx.clone();
|
||||||
|
let exited_tx = exited_tx.clone();
|
||||||
|
readers.push(std::thread::spawn(move || {
|
||||||
|
readers_ready.wait();
|
||||||
|
start_gate.wait();
|
||||||
|
let mut guard = lock.read_lock().expect("read lock");
|
||||||
|
let current = current_readers.fetch_add(1, Ordering::SeqCst) + 1;
|
||||||
|
max_concurrent_readers.fetch_max(current, Ordering::SeqCst);
|
||||||
|
entered_tx.send(()).expect("reader entered");
|
||||||
|
start_release.wait();
|
||||||
|
std::thread::sleep(Duration::from_millis(20));
|
||||||
|
current_readers.fetch_sub(1, Ordering::SeqCst);
|
||||||
|
exited_tx.send(()).expect("reader exited");
|
||||||
|
guard.dispose().expect("dispose read lock");
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
readers_ready.wait();
|
||||||
|
start_gate.wait();
|
||||||
|
for _ in 0..READER_COUNT {
|
||||||
|
entered_rx
|
||||||
|
.recv_timeout(Duration::from_secs(30))
|
||||||
|
.expect("all readers should enter within 30 seconds");
|
||||||
|
}
|
||||||
|
|
||||||
|
let writer_lock = Arc::clone(&lock);
|
||||||
|
let (writer_tx, writer_rx) = mpsc::channel();
|
||||||
|
let writer = std::thread::spawn(move || {
|
||||||
|
let mut guard = writer_lock.write_lock().expect("write lock");
|
||||||
|
writer_tx.send(()).expect("writer acquired");
|
||||||
|
guard.dispose().expect("dispose write lock");
|
||||||
|
});
|
||||||
|
assert!(writer_rx.recv_timeout(Duration::from_millis(100)).is_err());
|
||||||
|
start_release.wait();
|
||||||
|
for _ in 0..READER_COUNT {
|
||||||
|
exited_rx
|
||||||
|
.recv_timeout(Duration::from_secs(30))
|
||||||
|
.expect("all readers should exit within 30 seconds");
|
||||||
|
}
|
||||||
|
writer_rx
|
||||||
|
.recv_timeout(Duration::from_secs(30))
|
||||||
|
.expect("writer should acquire after readers exit");
|
||||||
|
assert!(max_concurrent_readers.load(Ordering::SeqCst) >= 2);
|
||||||
|
|
||||||
|
for reader in readers {
|
||||||
|
reader.join().expect("reader task");
|
||||||
|
}
|
||||||
|
writer.join().expect("writer task");
|
||||||
|
}
|
||||||
|
|
||||||
|
// parity-case: LibreMetaverse.Tests/UtilsConversionsTests.cs::UtilsConversionsTests.StringToBytes::test 0bef42801dc2a50e132b05440424c44da54b53c853708ee2c0ec9799dbe0e8b2 translated
|
||||||
|
#[test]
|
||||||
|
fn string_to_bytes() {
|
||||||
|
let text = "Your squirrel, your imagination";
|
||||||
|
let bytes = Utils::string_to_bytes(text.to_owned()).expect("Utils.StringToBytes");
|
||||||
|
let decoded = Utils::bytes_to_string_with_bytes(bytes).expect("Utils.BytesToString");
|
||||||
|
assert_eq!(decoded, text);
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -303,6 +303,13 @@ PRIVATE_LAYOUTS = {
|
|||||||
"T:LibreMetaverse.StructuredData.OSDUri": [("value", "libremetaverse_types::compat::Uri")],
|
"T:LibreMetaverse.StructuredData.OSDUri": [("value", "libremetaverse_types::compat::Uri")],
|
||||||
"T:LibreMetaverse.Imaging.ManagedImage": [("data", "Vec<u8>")],
|
"T:LibreMetaverse.Imaging.ManagedImage": [("data", "Vec<u8>")],
|
||||||
}
|
}
|
||||||
|
VALUE_DERIVES = {
|
||||||
|
"T:LibreMetaverse.Matrix4": "Clone, Copy, Debug",
|
||||||
|
"T:LibreMetaverse.Quaternion": "Clone, Copy, Debug",
|
||||||
|
"T:LibreMetaverse.UUID": "Clone, Copy, Debug, Default",
|
||||||
|
"T:LibreMetaverse.Vector3": "Clone, Copy, Debug",
|
||||||
|
"T:LibreMetaverse.Vector3d": "Clone, Copy, Debug",
|
||||||
|
}
|
||||||
def generic_names(item: dict) -> list[str]:
|
def generic_names(item: dict) -> list[str]:
|
||||||
return [parameter["name"] for parameter in item.get("generic_parameters", [])]
|
return [parameter["name"] for parameter in item.get("generic_parameters", [])]
|
||||||
|
|
||||||
@@ -522,6 +529,8 @@ def render_type(item: dict, type_row: dict, member_rows: dict[str, dict[str, str
|
|||||||
else:
|
else:
|
||||||
fields = [member for member in item["members"] if member["kind"] == "field" and not member.get("static")]
|
fields = [member for member in item["members"] if member["kind"] == "field" and not member.get("static")]
|
||||||
private_fields = PRIVATE_LAYOUTS.get(item["doc_id"], [])
|
private_fields = PRIVATE_LAYOUTS.get(item["doc_id"], [])
|
||||||
|
if derives := VALUE_DERIVES.get(item["doc_id"]):
|
||||||
|
lines.append(f"#[derive({derives})]")
|
||||||
if item["doc_id"] == "T:LibreMetaverse.StructuredData.OSD":
|
if item["doc_id"] == "T:LibreMetaverse.StructuredData.OSD":
|
||||||
lines += [
|
lines += [
|
||||||
"#[non_exhaustive]",
|
"#[non_exhaustive]",
|
||||||
|
|||||||
@@ -170,6 +170,12 @@ SUPPORT_TYPES = {
|
|||||||
MEMBER_RETURN_OVERRIDES = {
|
MEMBER_RETURN_OVERRIDES = {
|
||||||
"M:LibreMetaverse.Caps.Capabilities": "Vec<String>",
|
"M:LibreMetaverse.Caps.Capabilities": "Vec<String>",
|
||||||
}
|
}
|
||||||
|
TYPE_USAGE_OVERRIDES = {
|
||||||
|
"LibreMetaverse.DictionaryChangeCallback": (
|
||||||
|
"std::sync::Arc<dyn Fn(libremetaverse::DictionaryEventAction, "
|
||||||
|
"libremetaverse_types::compat::DictionaryEntry) + Send + Sync>"
|
||||||
|
),
|
||||||
|
}
|
||||||
TYPE_NAME_OVERRIDES = {
|
TYPE_NAME_OVERRIDES = {
|
||||||
"T:LibreMetaverse.LslTools.Error": "LslError",
|
"T:LibreMetaverse.LslTools.Error": "LslError",
|
||||||
}
|
}
|
||||||
@@ -419,7 +425,13 @@ def function_bodies(text: str) -> list[str]:
|
|||||||
def validate_generated_shims() -> None:
|
def validate_generated_shims() -> None:
|
||||||
for path in sorted((ROOT / "crates").glob("*/src/generated*.rs")):
|
for path in sorted((ROOT / "crates").glob("*/src/generated*.rs")):
|
||||||
text = path.read_text()
|
text = path.read_text()
|
||||||
if re.search(r"#\[derive\([^]]*\bDefault\b", text):
|
default_types = set(
|
||||||
|
re.findall(
|
||||||
|
r"#\[derive\([^]]*\bDefault\b[^]]*\)\]\s*pub struct ([A-Za-z_][A-Za-z0-9_]*)",
|
||||||
|
text,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if default_types - {"UUID"}:
|
||||||
raise ValueError(f"generated shim derives a plausible Default: {path.relative_to(ROOT)}")
|
raise ValueError(f"generated shim derives a plausible Default: {path.relative_to(ROOT)}")
|
||||||
for body in function_bodies(text):
|
for body in function_bodies(text):
|
||||||
if FAKE_BODY.search(body):
|
if FAKE_BODY.search(body):
|
||||||
@@ -514,7 +526,7 @@ class Mapper:
|
|||||||
if base in generics or ("." not in base and base.startswith("T")):
|
if base in generics or ("." not in base and base.startswith("T")):
|
||||||
target = base
|
target = base
|
||||||
elif target is None:
|
elif target is None:
|
||||||
target = self.resolved.get(base)
|
target = TYPE_USAGE_OVERRIDES.get(base, self.resolved.get(base))
|
||||||
if target is None:
|
if target is None:
|
||||||
raise ValueError(f"unresolved referenced type: {value} (base {base})")
|
raise ValueError(f"unresolved referenced type: {value} (base {base})")
|
||||||
if mapped_arguments and base not in {
|
if mapped_arguments and base not in {
|
||||||
|
|||||||
Reference in New Issue
Block a user