Skip to content

Commit

Permalink
Test auto traits and object safety (#153)
Browse files Browse the repository at this point in the history
* Test auto traits for all types

* Test object safety
  • Loading branch information
madsmtm committed Oct 14, 2023
1 parent 2c2aaa9 commit 76f0fb0
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 10 deletions.
3 changes: 3 additions & 0 deletions Cargo.toml
Expand Up @@ -24,6 +24,9 @@ default-features = false
features = ["std"]
optional = true

[dev-dependencies]
static_assertions = "1.1.0"

[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "docsrs"]
12 changes: 2 additions & 10 deletions src/borrowed.rs
Expand Up @@ -79,7 +79,7 @@ impl<H: HasDisplayHandle + ?Sized> HasDisplayHandle for alloc::sync::Arc<H> {
#[derive(PartialEq, Eq, Hash, Copy, Clone)]
pub struct DisplayHandle<'a> {
raw: RawDisplayHandle,
_marker: PhantomData<&'a *const ()>,
_marker: PhantomData<&'a ()>,
}

impl fmt::Debug for DisplayHandle<'_> {
Expand Down Expand Up @@ -210,7 +210,7 @@ impl<H: HasWindowHandle + ?Sized> HasWindowHandle for alloc::sync::Arc<H> {
#[derive(PartialEq, Eq, Hash, Copy, Clone)]
pub struct WindowHandle<'a> {
raw: RawWindowHandle,
_marker: PhantomData<&'a *const ()>,
_marker: PhantomData<&'a ()>,
}

impl fmt::Debug for WindowHandle<'_> {
Expand Down Expand Up @@ -280,11 +280,3 @@ impl HasWindowHandle for WindowHandle<'_> {
Ok(*self)
}
}

/// ```compile_fail
/// use raw_window_handle::{DisplayHandle, WindowHandle};
/// fn _assert<T: Send + Sync>() {}
/// _assert::<DisplayHandle<'static>>();
/// _assert::<WindowHandle<'static>>();
/// ```
fn _not_send_or_sync() {}
61 changes: 61 additions & 0 deletions src/lib.rs
Expand Up @@ -420,3 +420,64 @@ from_impl!(
);
from_impl!(RawWindowHandle, AndroidNdk, AndroidNdkWindowHandle);
from_impl!(RawWindowHandle, Haiku, HaikuWindowHandle);

#[cfg(test)]
mod tests {
use core::panic::{RefUnwindSafe, UnwindSafe};
use static_assertions::{assert_impl_all, assert_not_impl_any};

use super::*;

#[test]
fn auto_traits() {
assert_impl_all!(RawDisplayHandle: UnwindSafe, RefUnwindSafe, Unpin);
assert_not_impl_any!(RawDisplayHandle: Send, Sync);
assert_impl_all!(DisplayHandle<'_>: UnwindSafe, RefUnwindSafe, Unpin);
assert_not_impl_any!(DisplayHandle<'_>: Send, Sync);
assert_impl_all!(RawWindowHandle: UnwindSafe, RefUnwindSafe, Unpin);
assert_not_impl_any!(RawWindowHandle: Send, Sync);
assert_impl_all!(WindowHandle<'_>: UnwindSafe, RefUnwindSafe, Unpin);
assert_not_impl_any!(WindowHandle<'_>: Send, Sync);
assert_impl_all!(HandleError: Send, Sync, UnwindSafe, RefUnwindSafe, Unpin);

// TODO: Unsure if some of these should not actually be Send + Sync
assert_impl_all!(UiKitDisplayHandle: Send, Sync);
assert_impl_all!(AppKitDisplayHandle: Send, Sync);
assert_impl_all!(OrbitalDisplayHandle: Send, Sync);
assert_not_impl_any!(XlibDisplayHandle: Send, Sync);
assert_not_impl_any!(XcbDisplayHandle: Send, Sync);
assert_not_impl_any!(WaylandDisplayHandle: Send, Sync);
assert_impl_all!(DrmDisplayHandle: Send, Sync);
assert_not_impl_any!(GbmDisplayHandle: Send, Sync);
assert_impl_all!(WindowsDisplayHandle: Send, Sync);
assert_impl_all!(WebDisplayHandle: Send, Sync);
assert_impl_all!(AndroidDisplayHandle: Send, Sync);
assert_impl_all!(HaikuDisplayHandle: Send, Sync);

// TODO: Unsure if some of these should not actually be Send + Sync
assert_not_impl_any!(UiKitWindowHandle: Send, Sync);
assert_not_impl_any!(AppKitWindowHandle: Send, Sync);
assert_not_impl_any!(OrbitalWindowHandle: Send, Sync);
assert_impl_all!(XlibWindowHandle: Send, Sync);
assert_impl_all!(XcbWindowHandle: Send, Sync);
assert_not_impl_any!(WaylandWindowHandle: Send, Sync);
assert_impl_all!(DrmWindowHandle: Send, Sync);
assert_not_impl_any!(GbmWindowHandle: Send, Sync);
assert_impl_all!(Win32WindowHandle: Send, Sync);
assert_not_impl_any!(WinRtWindowHandle: Send, Sync);
assert_impl_all!(WebWindowHandle: Send, Sync);
assert_not_impl_any!(WebCanvasWindowHandle: Send, Sync);
assert_not_impl_any!(WebOffscreenCanvasWindowHandle: Send, Sync);
assert_not_impl_any!(AndroidNdkWindowHandle: Send, Sync);
assert_not_impl_any!(HaikuWindowHandle: Send, Sync);
}

#[allow(deprecated, unused)]
fn assert_object_safe(
_: &dyn HasRawWindowHandle,
_: &dyn HasRawDisplayHandle,
_: &dyn HasWindowHandle,
_: &dyn HasDisplayHandle,
) {
}
}

0 comments on commit 76f0fb0

Please sign in to comment.