#![cfg(feature = "rar1")]
use compcol::rar1::{Decoder, Encoder, Rar1};
use compcol::{Algorithm, Decoder as _, Encoder as _, Error, Status};
#[test]
fn name_is_rar1() {
assert_eq!(<Rar1 as Algorithm>::NAME, "rar1");
}
#[test]
fn algorithm_factory_produces_codec() {
let _enc = <Rar1 as Algorithm>::encoder();
let _dec = <Rar1 as Algorithm>::decoder();
}
#[test]
fn factory_returns_decoder() {
let mut d = <Rar1 as Algorithm>::decoder();
let mut out = [0u8; 1];
let (p, status) = d.decode(&[], &mut out).unwrap();
assert_eq!(p.consumed, 0);
assert_eq!(p.written, 0);
assert!(matches!(status, Status::InputEmpty));
}
#[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).unwrap_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).unwrap_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).unwrap_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).unwrap_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).unwrap_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, status) = d.decode(&[], &mut out).unwrap();
assert_eq!(p.consumed, 0);
assert_eq!(p.written, 0);
assert!(matches!(status, Status::InputEmpty));
}
#[test]
fn decode_empty_input_zero_output_is_noop() {
let mut d = Decoder::new();
let mut out: [u8; 0] = [];
let (p, status) = d.decode(&[], &mut out).unwrap();
assert_eq!(p.consumed, 0);
assert_eq!(p.written, 0);
assert!(matches!(status, Status::InputEmpty));
}
#[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).unwrap_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).unwrap_err(), Error::Unsupported);
}
#[test]
fn finish_on_fresh_decoder_is_stream_end() {
let mut d = Decoder::new();
let mut out = [0u8; 4];
let (p, status) = d.finish(&mut out).unwrap();
assert!(matches!(status, Status::StreamEnd));
assert_eq!(p.consumed, 0);
assert_eq!(p.written, 0);
}
#[test]
fn finish_on_fresh_decoder_with_unpack_size_is_stream_end() {
let mut d = Decoder::with_unpack_size(100);
let mut out = [0u8; 4];
let (p, status) = d.finish(&mut out).unwrap();
assert!(matches!(status, Status::StreamEnd));
assert_eq!(p.written, 0);
}
#[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, status) = d.finish(&mut out).unwrap();
assert!(matches!(status, Status::StreamEnd));
}
#[test]
fn skip_default_implementation_propagates_unsupported() {
let mut d = Decoder::new();
let result = d.discard_output(b"some-bytes", 100);
assert_eq!(result.unwrap_err(), Error::Unsupported);
}
#[test]
fn skip_with_empty_input_returns_zero_progress() {
let mut d = Decoder::new();
let (p, _status) = d.discard_output(&[], 100).unwrap();
assert_eq!(p.consumed, 0);
assert_eq!(p.written, 0);
}
#[cfg(feature = "factory")]
mod factory {
use compcol::Error;
use compcol::factory;
#[test]
fn lookup_rar1_encoder_and_decoder() {
assert!(factory::encoder_by_name("rar1").is_some());
assert!(factory::decoder_by_name("rar1").is_some());
}
#[test]
fn lookup_unknown() {
assert!(factory::encoder_by_name("not-a-real-rar1").is_none());
assert!(factory::decoder_by_name("not-a-real-rar1").is_none());
}
#[test]
fn names_contains_rar1() {
assert!(factory::names().contains(&"rar1"));
}
#[test]
fn boxed_encoder_is_unsupported() {
let mut e = factory::encoder_by_name("rar1").expect("rar1 is in the factory");
let mut out = [0u8; 4];
assert_eq!(e.encode(b"x", &mut out).unwrap_err(), Error::Unsupported);
}
#[test]
fn boxed_decoder_is_unsupported_on_real_input() {
let mut d = factory::decoder_by_name("rar1").expect("rar1 is in the factory");
let mut out = [0u8; 4];
assert_eq!(d.decode(b"x", &mut out).unwrap_err(), Error::Unsupported);
}
}