#![cfg(test)]
mod setup;
use super::Connection;
use crate::{
auto::{
xproto::{Setup, SetupRequest},
AsByteSequence,
},
display::{BasicDisplay, StaticSetup},
Fd,
};
use alloc::{borrow::Cow, collections::VecDeque, vec::Vec};
use core::iter;
use tinyvec::TinyVec;
#[derive(Debug)]
pub struct DummyConnection {
expected: VecDeque<u8>,
reply: VecDeque<u8>,
}
impl DummyConnection {
#[inline]
pub fn with_no_defaults() -> Self {
Self {
expected: VecDeque::new(),
reply: VecDeque::new(),
}
}
#[inline]
pub fn expects_bytes<I: IntoIterator<Item = u8>>(&mut self, bytes: I) {
self.expected.extend(bytes);
}
#[inline]
pub fn reply_bytes<I: IntoIterator<Item = u8>>(&mut self, bytes: I) {
self.reply.extend(bytes);
}
#[inline]
pub fn expects<O: AsByteSequence>(&mut self, object: O) {
let mut data: TinyVec<[u8; 32]> = iter::repeat(0).take(object.size()).collect();
object.as_bytes(&mut data);
self.expects_bytes(data);
}
#[inline]
pub fn reply<O: AsByteSequence>(&mut self, object: O) {
let mut data: TinyVec<[u8; 32]> = iter::repeat(0).take(object.size()).collect();
object.as_bytes(&mut data);
self.reply_bytes(data)
}
#[inline]
pub fn new() -> Self {
let mut this = Self::with_no_defaults();
this.expects(SetupRequest {
byte_order: if cfg!(target_endian = "little") {
b'l'
} else {
b'B'
},
protocol_major_version: 11,
protocol_minor_version: 0,
authorization_protocol_name: "".into(),
authorization_protocol_data: Cow::Borrowed(&[]),
});
this.reply_bytes(default_setup());
this
}
}
impl Connection for DummyConnection {
#[inline]
fn send_packet(&mut self, bytes: &[u8], _fds: &mut Vec<Fd>) -> crate::Result {
for sent_byte in bytes.iter().copied() {
match self.expected.pop_front() {
Some(expected) => assert_eq!(sent_byte, expected),
_ => (),
}
}
Ok(())
}
#[inline]
fn read_packet(&mut self, bytes: &mut [u8], _fds: &mut Vec<Fd>) -> crate::Result {
for read_byte in bytes.iter_mut() {
*read_byte = match self.reply.pop_front() {
Some(reply) => reply,
None => 0,
};
}
Ok(())
}
}
impl BasicDisplay<DummyConnection> {
#[inline]
pub fn dummy() -> Self {
Self::from_connection(DummyConnection::new(), 0, None)
.expect("Failed to create dummy display")
}
}
#[inline]
fn default_setup() -> Vec<u8> {
setup::default_setup()
}