#![cfg(feature = "rar1")]
use compcol::rar1::{Decoder, Encoder, Rar1};
use compcol::{Algorithm, Decoder as _, Encoder as _, Error};
#[test]
fn name_is_rar1() {
assert_eq!(<Rar1 as Algorithm>::NAME, "rar1");
}
#[test]
fn factory_returns_decoder() {
let mut d = <Rar1 as Algorithm>::decoder();
let mut out = [0u8; 1];
let p = d.decode(&[], &mut out).unwrap();
assert_eq!(p.consumed, 0);
assert_eq!(p.written, 0);
}
#[test]
fn factory_returns_encoder_that_errors() {
let mut e = <Rar1 as Algorithm>::encoder();
let mut out = [0u8; 1];
assert_eq!(e.encode(b"x", &mut out), Err(Error::Unsupported));
}
#[test]
fn encoder_encode_is_unsupported() {
let mut e = Encoder::new();
let mut out = [0u8; 16];
assert_eq!(e.encode(b"hello world", &mut out), Err(Error::Unsupported));
}
#[test]
fn encoder_finish_is_unsupported() {
let mut e = Encoder::new();
let mut out = [0u8; 16];
assert_eq!(e.finish(&mut out), Err(Error::Unsupported));
}
#[test]
fn encoder_encode_with_empty_input_still_unsupported() {
let mut e = Encoder::new();
let mut out = [0u8; 16];
assert_eq!(e.encode(&[], &mut out), Err(Error::Unsupported));
}
#[test]
fn encoder_reset_does_not_panic() {
let mut e = Encoder::new();
e.reset();
let mut out = [0u8; 16];
assert_eq!(e.encode(b"x", &mut out), Err(Error::Unsupported));
}
#[test]
fn decoder_new_has_no_unpack_size() {
let d = Decoder::new();
assert_eq!(d.unpack_size(), None);
}
#[test]
fn decoder_with_unpack_size_records_value() {
let d = Decoder::with_unpack_size(4_321);
assert_eq!(d.unpack_size(), Some(4_321));
}
#[test]
fn decoder_with_unpack_size_zero_is_valid() {
let d = Decoder::with_unpack_size(0);
assert_eq!(d.unpack_size(), Some(0));
}
#[test]
fn decoder_with_unpack_size_large() {
let d = Decoder::with_unpack_size(u64::from(u32::MAX));
assert_eq!(d.unpack_size(), Some(u64::from(u32::MAX)));
}
#[test]
fn decode_empty_input_is_noop() {
let mut d = Decoder::new();
let mut out = [0u8; 4];
let p = d.decode(&[], &mut out).unwrap();
assert_eq!(p.consumed, 0);
assert_eq!(p.written, 0);
assert!(!p.done);
}
#[test]
fn decode_empty_input_zero_output_is_noop() {
let mut d = Decoder::new();
let mut out: [u8; 0] = [];
let p = d.decode(&[], &mut out).unwrap();
assert_eq!(p.consumed, 0);
assert_eq!(p.written, 0);
assert!(!p.done);
}
#[test]
fn decode_nonempty_input_returns_unsupported() {
let mut d = Decoder::new();
let mut out = [0u8; 16];
assert_eq!(d.decode(b"\xCA\xFE", &mut out), Err(Error::Unsupported));
}
#[test]
fn decode_nonempty_input_with_unpack_size_still_unsupported() {
let mut d = Decoder::with_unpack_size(128);
let mut out = [0u8; 16];
assert_eq!(d.decode(b"\x01", &mut out), Err(Error::Unsupported));
}
#[test]
fn finish_on_fresh_decoder_is_done() {
let mut d = Decoder::new();
let mut out = [0u8; 4];
let p = d.finish(&mut out).unwrap();
assert!(p.done);
assert_eq!(p.consumed, 0);
assert_eq!(p.written, 0);
}
#[test]
fn finish_on_fresh_decoder_with_unpack_size_is_done() {
let mut d = Decoder::with_unpack_size(100);
let mut out = [0u8; 4];
let p = d.finish(&mut out).unwrap();
assert!(p.done);
}
#[test]
fn reset_returns_to_initial_state() {
let mut d = Decoder::with_unpack_size(42);
let mut out = [0u8; 4];
let _ = d.decode(&[0xFF], &mut out);
d.reset();
assert_eq!(d.unpack_size(), None);
let p = d.finish(&mut out).unwrap();
assert!(p.done);
}
#[test]
fn skip_default_implementation_does_not_panic() {
let mut d = Decoder::new();
let result = d.skip(b"some-bytes", 100);
assert!(matches!(result, Err(Error::Unsupported)));
}
#[test]
fn skip_with_empty_input_returns_zero_progress() {
let mut d = Decoder::new();
let p = d.skip(&[], 100).unwrap();
assert_eq!(p.consumed, 0);
assert_eq!(p.written, 0);
}
#[cfg(feature = "factory")]
#[test]
fn decoder_via_factory_by_name() {
use compcol::factory::decoder_by_name;
let mut d = decoder_by_name("rar1").expect("rar1 is in the factory");
let mut out = [0u8; 4];
assert_eq!(d.decode(b"x", &mut out), Err(Error::Unsupported));
}
#[cfg(feature = "factory")]
#[test]
fn encoder_via_factory_by_name() {
use compcol::factory::encoder_by_name;
let mut e = encoder_by_name("rar1").expect("rar1 is in the factory");
let mut out = [0u8; 4];
assert_eq!(e.encode(b"x", &mut out), Err(Error::Unsupported));
}