aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/display.rs143
-rw-r--r--tests/lib.rs50
2 files changed, 193 insertions, 0 deletions
diff --git a/tests/display.rs b/tests/display.rs
new file mode 100644
index 0000000..8826303
--- /dev/null
+++ b/tests/display.rs
@@ -0,0 +1,143 @@
+
+// this was something of a misfeature for these formatters..
+#[test]
+#[allow(deprecated)]
+fn formatters_are_not_feature_gated() {
+ use yaxpeax_arch::display::{
+ u8_hex, u16_hex, u32_hex, u64_hex,
+ signed_i8_hex, signed_i16_hex, signed_i32_hex, signed_i64_hex
+ };
+ let _ = u8_hex(10);
+ let _ = u16_hex(10);
+ let _ = u32_hex(10);
+ let _ = u64_hex(10);
+ let _ = signed_i8_hex(10);
+ let _ = signed_i16_hex(10);
+ let _ = signed_i32_hex(10);
+ let _ = signed_i64_hex(10);
+}
+
+#[cfg(feature="alloc")]
+#[test]
+fn instruction_text_sink_write_char_requires_ascii() {
+ use core::fmt::Write;
+
+ let mut text = String::with_capacity(512);
+ let mut sink = unsafe {
+ yaxpeax_arch::display::InstructionTextSink::new(&mut text)
+ };
+ let expected = "`1234567890-=+_)(*&^%$#@!~\\][poiuytrewq |}{POIUYTREWQ';lkjhgfdsa\":LKJHGFDSA/.,mnbvcxz?><MNBVCXZ \r\n";
+ for c in expected.as_bytes().iter() {
+ sink.write_char(*c as char).expect("write works");
+ }
+ assert_eq!(text, expected);
+}
+
+#[cfg(feature="alloc")]
+#[test]
+#[should_panic]
+fn instruction_text_sink_write_char_rejects_not_ascii() {
+ use core::fmt::Write;
+
+ let mut text = String::with_capacity(512);
+ let mut sink = unsafe {
+ yaxpeax_arch::display::InstructionTextSink::new(&mut text)
+ };
+ sink.write_char('\u{80}').expect("write works");
+}
+
+#[cfg(feature="alloc")]
+#[test]
+fn display_sink_write_hex_helpers() {
+ use yaxpeax_arch::display::{DisplaySink};
+
+ // for u8/i8/u16/i16 we can exhaustively test. we'll leave the rest for fuzzers.
+ let mut buf = String::new();
+ for i in 0..=u8::MAX {
+ buf.clear();
+ buf.write_u8(i).expect("write succeeds");
+ assert_eq!(buf, format!("{:x}", i));
+
+ buf.clear();
+ buf.write_prefixed_u8(i).expect("write succeeds");
+ assert_eq!(buf, format!("0x{:x}", i));
+
+ let expected = if (i as i8) < 0 {
+ format!("-0x{:x}", (i as i8).unsigned_abs())
+ } else {
+ format!("0x{:x}", i)
+ };
+
+ buf.clear();
+ buf.write_prefixed_i8(i as i8).expect("write succeeds");
+ assert_eq!(buf, expected);
+ }
+
+ for i in 0..=u16::MAX {
+ buf.clear();
+ buf.write_u16(i).expect("write succeeds");
+ assert_eq!(buf, format!("{:x}", i));
+
+ buf.clear();
+ buf.write_prefixed_u16(i).expect("write succeeds");
+ assert_eq!(buf, format!("0x{:x}", i));
+
+ let expected = if (i as i16) < 0 {
+ format!("-0x{:x}", (i as i16).unsigned_abs())
+ } else {
+ format!("0x{:x}", i)
+ };
+
+ buf.clear();
+ buf.write_prefixed_i16(i as i16).expect("write succeeds");
+ assert_eq!(buf, expected);
+ }
+}
+
+#[cfg(feature="alloc")]
+#[test]
+fn sinks_are_equivalent() {
+ use yaxpeax_arch::display::{DisplaySink, FmtSink};
+ use yaxpeax_arch::testkit::DisplaySinkWriteComparator;
+
+ let mut bare = String::new();
+ let mut through_sink = String::new();
+ for i in 0..u16::MAX {
+ bare.clear();
+ through_sink.clear();
+ let mut out = FmtSink::new(&mut through_sink);
+ let mut comparator = DisplaySinkWriteComparator::new(
+ &mut out,
+ |sink| { sink.inner_ref().as_str() },
+ &mut bare,
+ |sink| { sink.as_str() },
+ );
+ comparator.write_u16(i).expect("write succeeds");
+ comparator.write_prefixed_u16(i).expect("write succeeds");
+ comparator.write_prefixed_i16(i as i16).expect("write succeeds");
+ }
+}
+
+#[cfg(all(feature="alloc", feature="color-new"))]
+#[test]
+fn ansi_sink_works() {
+ use yaxpeax_arch::color_new::ansi::AnsiDisplaySink;
+ use yaxpeax_arch::display::DisplaySink;
+
+ let mut buf = String::new();
+
+ let mut ansi_sink = AnsiDisplaySink::new(&mut buf, yaxpeax_arch::color_new::DefaultColors);
+
+ ansi_sink.span_start_immediate();
+ ansi_sink.write_prefixed_u8(0x80).expect("write succeeds");
+ ansi_sink.span_end_immediate();
+ ansi_sink.write_fixed_size("(").expect("write succeeds");
+ ansi_sink.span_start_register();
+ ansi_sink.write_fixed_size("rbp").expect("write succeeds");
+ ansi_sink.span_end_register();
+ ansi_sink.write_fixed_size(")").expect("write succeeds");
+
+ drop(ansi_sink);
+
+ assert_eq!(buf, "\x1b[37m0x80\x1b[39m(\x1b[38;5;6mrbp\x1b[39m)");
+}
diff --git a/tests/lib.rs b/tests/lib.rs
index 1d5e964..9dc1449 100644
--- a/tests/lib.rs
+++ b/tests/lib.rs
@@ -12,6 +12,7 @@ fn test_u16() {
}
#[test]
+#[cfg(std)]
fn generic_error_can_bail() {
use yaxpeax_arch::{Arch, Decoder, Reader};
@@ -23,6 +24,7 @@ fn generic_error_can_bail() {
}
}
#[test]
+#[cfg(std)]
fn error_can_bail() {
use yaxpeax_arch::{Arch, AddressDiff, Decoder, Reader, LengthedInstruction, Instruction, StandardDecodeError, U8Reader};
struct TestIsa {}
@@ -76,3 +78,51 @@ fn error_can_bail() {
assert_eq!(exercise_eq(), Err(Error::TestDecode(StandardDecodeError::ExhaustedInput)));
}
+
+#[test]
+fn example_arch_impl() {
+ use yaxpeax_arch::{Arch, AddressDiff, Decoder, Reader, LengthedInstruction, Instruction, StandardDecodeError, U8Reader};
+ struct TestIsa {}
+ #[derive(Debug, Default)]
+ struct TestInst {}
+ impl Arch for TestIsa {
+ type Word = u8;
+ type Address = u64;
+ type Instruction = TestInst;
+ type Decoder = TestIsaDecoder;
+ type DecodeError = StandardDecodeError;
+ type Operand = ();
+ }
+
+ impl Instruction for TestInst {
+ fn well_defined(&self) -> bool { true }
+ }
+
+ impl LengthedInstruction for TestInst {
+ type Unit = AddressDiff<u64>;
+ fn len(&self) -> Self::Unit { AddressDiff::from_const(1) }
+ fn min_size() -> Self::Unit { AddressDiff::from_const(1) }
+ }
+
+ struct TestIsaDecoder {}
+
+ impl Default for TestIsaDecoder {
+ fn default() -> Self {
+ TestIsaDecoder {}
+ }
+ }
+
+ impl Decoder<TestIsa> for TestIsaDecoder {
+ fn decode_into<T: Reader<u64, u8>>(&self, _inst: &mut TestInst, _words: &mut T) -> Result<(), StandardDecodeError> {
+ Err(StandardDecodeError::ExhaustedInput)
+ }
+ }
+
+ fn exercise_eq() -> Result<(), StandardDecodeError> {
+ let mut reader = U8Reader::new(&[]);
+ TestIsaDecoder::default().decode(&mut reader)?;
+ Ok(())
+ }
+
+ assert_eq!(exercise_eq(), Err(StandardDecodeError::ExhaustedInput));
+}