1 #![allow(dead_code, non_snake_case)]
2
3 use std::sync::Arc;
4
5 use crate::protocol::{Argument, Message};
6
7 use crate::rs::{client as client_rs, server as server_rs};
8 use crate::sys::{client as client_sys, server as server_sys};
9
10 macro_rules! expand_test {
11 ($test_name:ident, $test_body:tt) => {
12 expand_test!(__list_expand, __no_panic, $test_name, $test_body);
13 };
14 (panic $test_name:ident, $test_body:tt) => {
15 expand_test!(__list_expand, __panic, $test_name, $test_body);
16 };
17 (__list_expand, $panic:tt, $test_name:ident, $test_body:tt) => {
18 expand_test!(__expand, $panic, $test_name, client_rs, server_rs, $test_body);
19 expand_test!(__expand, $panic, $test_name, client_sys, server_rs, $test_body);
20 expand_test!(__expand, $panic, $test_name, client_rs, server_sys, $test_body);
21 expand_test!(__expand, $panic, $test_name, client_sys, server_sys, $test_body);
22 };
23 (__expand, __panic, $test_name: ident, $client_backend: ty, $server_backend: ident, $test_body: tt) => {
24 concat_idents::concat_idents!(fn_name = $test_name, __, $client_backend, __, $server_backend {
25 #[test]
26 #[should_panic]
27 #[allow(unused_imports)]
28 fn fn_name() {
29 let _ = env_logger::builder().is_test(true).try_init();
30 use $client_backend as client_backend;
31 use $server_backend as server_backend;
32 $test_body
33 }
34 });
35 };
36 (__expand, __no_panic, $test_name: ident, $client_backend: ty, $server_backend: ident, $test_body: tt) => {
37 concat_idents::concat_idents!(fn_name = $test_name, __, $client_backend, __, $server_backend {
38 #[test]
39 #[allow(unused_imports)]
40 fn fn_name() {
41 let _ = env_logger::builder().is_test(true).try_init();
42 use $client_backend as client_backend;
43 use $server_backend as server_backend;
44 $test_body
45 }
46 });
47 };
48 }
49
50 mod interfaces {
51 use crate as wayland_backend;
52 wayland_scanner::generate_interfaces!(
53 "../wayland-scanner/tests/scanner_assets/test-protocol.xml"
54 );
55 }
56
57 mod destructors;
58 mod many_args;
59 mod object_args;
60 mod protocol_error;
61 mod server_created_objects;
62 mod sync;
63
64 /*
65 * Assertion of Send/Sync for all relevant objects
66 */
67
ensure_both<I: Send + Sync>()68 fn ensure_both<I: Send + Sync>() {}
69
70 #[allow(dead_code)]
send_sync_client_rs()71 fn send_sync_client_rs() {
72 ensure_both::<client_rs::Backend>();
73 ensure_both::<client_rs::ObjectId>();
74 }
75
76 #[allow(dead_code)]
send_sync_client_sys()77 fn send_sync_client_sys() {
78 ensure_both::<client_sys::Backend>();
79 ensure_both::<client_sys::ObjectId>();
80 }
81
82 #[allow(dead_code)]
send_sync_server_rs()83 fn send_sync_server_rs() {
84 ensure_both::<server_rs::Backend<()>>();
85 ensure_both::<server_rs::ObjectId>();
86 ensure_both::<server_rs::GlobalId>();
87 ensure_both::<server_rs::ClientId>();
88 }
89
90 #[allow(dead_code)]
send_sync_server_sys()91 fn send_sync_server_sys() {
92 ensure_both::<server_sys::Backend<()>>();
93 ensure_both::<server_sys::ObjectId>();
94 ensure_both::<server_sys::GlobalId>();
95 ensure_both::<server_sys::ClientId>();
96 }
97
98 /*
99 * A "do nothing" data as a helper
100 */
101 struct DoNothingData;
102
103 // Server Client Data
104
105 impl<D> server_rs::ClientData<D> for DoNothingData {
initialized(&self, _: server_rs::ClientId)106 fn initialized(&self, _: server_rs::ClientId) {}
disconnected(&self, _: server_rs::ClientId, _: server_rs::DisconnectReason)107 fn disconnected(&self, _: server_rs::ClientId, _: server_rs::DisconnectReason) {}
108 }
109
110 impl<D> server_sys::ClientData<D> for DoNothingData {
initialized(&self, _: server_sys::ClientId)111 fn initialized(&self, _: server_sys::ClientId) {}
disconnected(&self, _: server_sys::ClientId, _: server_rs::DisconnectReason)112 fn disconnected(&self, _: server_sys::ClientId, _: server_rs::DisconnectReason) {}
113 }
114
115 // Server Global Handler
116
117 impl<D> server_rs::GlobalHandler<D> for DoNothingData {
bind( self: Arc<Self>, _: &mut server_rs::Handle<D>, _: &mut D, _: server_rs::ClientId, _: server_rs::GlobalId, _: server_rs::ObjectId, ) -> Arc<dyn server_rs::ObjectData<D>>118 fn bind(
119 self: Arc<Self>,
120 _: &mut server_rs::Handle<D>,
121 _: &mut D,
122 _: server_rs::ClientId,
123 _: server_rs::GlobalId,
124 _: server_rs::ObjectId,
125 ) -> Arc<dyn server_rs::ObjectData<D>> {
126 self
127 }
128 }
129
130 impl<D> server_sys::GlobalHandler<D> for DoNothingData {
bind( self: Arc<Self>, _: &mut server_sys::Handle<D>, _: &mut D, _: server_sys::ClientId, _: server_sys::GlobalId, _: server_sys::ObjectId, ) -> Arc<dyn server_sys::ObjectData<D>>131 fn bind(
132 self: Arc<Self>,
133 _: &mut server_sys::Handle<D>,
134 _: &mut D,
135 _: server_sys::ClientId,
136 _: server_sys::GlobalId,
137 _: server_sys::ObjectId,
138 ) -> Arc<dyn server_sys::ObjectData<D>> {
139 self
140 }
141 }
142
143 // Server Object Data
144
145 impl<D> server_rs::ObjectData<D> for DoNothingData {
request( self: Arc<Self>, _: &mut server_rs::Handle<D>, _: &mut D, _: server_rs::ClientId, _: Message<server_rs::ObjectId>, ) -> Option<Arc<dyn server_rs::ObjectData<D>>>146 fn request(
147 self: Arc<Self>,
148 _: &mut server_rs::Handle<D>,
149 _: &mut D,
150 _: server_rs::ClientId,
151 _: Message<server_rs::ObjectId>,
152 ) -> Option<Arc<dyn server_rs::ObjectData<D>>> {
153 None
154 }
155
destroyed(&self, _: &mut D, _: server_rs::ClientId, _: server_rs::ObjectId)156 fn destroyed(&self, _: &mut D, _: server_rs::ClientId, _: server_rs::ObjectId) {}
157 }
158
159 impl<D> server_sys::ObjectData<D> for DoNothingData {
request( self: Arc<Self>, _: &mut server_sys::Handle<D>, _: &mut D, _: server_sys::ClientId, _: Message<server_sys::ObjectId>, ) -> Option<Arc<dyn server_sys::ObjectData<D>>>160 fn request(
161 self: Arc<Self>,
162 _: &mut server_sys::Handle<D>,
163 _: &mut D,
164 _: server_sys::ClientId,
165 _: Message<server_sys::ObjectId>,
166 ) -> Option<Arc<dyn server_sys::ObjectData<D>>> {
167 None
168 }
169
destroyed(&self, _: &mut D, _: server_sys::ClientId, _: server_sys::ObjectId)170 fn destroyed(&self, _: &mut D, _: server_sys::ClientId, _: server_sys::ObjectId) {}
171 }
172
173 // Client Object Data
174
175 impl client_rs::ObjectData for DoNothingData {
event( self: Arc<Self>, _: &mut client_rs::Handle, _: Message<client_rs::ObjectId>, ) -> Option<Arc<dyn client_rs::ObjectData>>176 fn event(
177 self: Arc<Self>,
178 _: &mut client_rs::Handle,
179 _: Message<client_rs::ObjectId>,
180 ) -> Option<Arc<dyn client_rs::ObjectData>> {
181 None
182 }
183
destroyed(&self, _: client_rs::ObjectId)184 fn destroyed(&self, _: client_rs::ObjectId) {}
185 }
186
187 impl client_sys::ObjectData for DoNothingData {
event( self: Arc<Self>, _: &mut client_sys::Handle, _: Message<client_sys::ObjectId>, ) -> Option<Arc<dyn client_sys::ObjectData>>188 fn event(
189 self: Arc<Self>,
190 _: &mut client_sys::Handle,
191 _: Message<client_sys::ObjectId>,
192 ) -> Option<Arc<dyn client_sys::ObjectData>> {
193 None
194 }
195
destroyed(&self, _: client_sys::ObjectId)196 fn destroyed(&self, _: client_sys::ObjectId) {}
197 }
198