#![allow(
clippy::approx_constant,
clippy::useless_vec,
clippy::len_zero,
clippy::unnecessary_cast,
clippy::redundant_closure,
clippy::too_many_arguments,
clippy::type_complexity,
clippy::needless_borrow,
clippy::enum_variant_names,
clippy::upper_case_acronyms,
clippy::inconsistent_digit_grouping,
clippy::unit_cmp,
clippy::assertions_on_constants,
clippy::iter_on_single_items,
clippy::expect_fun_call,
clippy::redundant_pattern_matching,
variant_size_differences,
clippy::absurd_extreme_comparisons,
clippy::nonminimal_bool,
clippy::for_kv_map,
clippy::needless_range_loop,
clippy::single_match,
clippy::collapsible_if,
clippy::needless_return,
clippy::redundant_clone,
clippy::map_entry,
clippy::match_single_binding,
clippy::bool_comparison,
clippy::derivable_impls,
clippy::manual_range_contains,
clippy::needless_borrows_for_generic_args,
clippy::manual_map,
clippy::vec_init_then_push,
clippy::identity_op,
clippy::manual_flatten,
clippy::single_char_pattern,
clippy::search_is_some,
clippy::option_map_unit_fn,
clippy::while_let_on_iterator,
clippy::clone_on_copy,
clippy::box_collection,
clippy::redundant_field_names,
clippy::ptr_arg,
clippy::large_enum_variant,
clippy::match_ref_pats,
clippy::needless_pass_by_value,
clippy::unused_unit,
clippy::let_and_return,
clippy::suspicious_else_formatting,
clippy::manual_strip,
clippy::match_like_matches_macro,
clippy::from_over_into,
clippy::wrong_self_convention,
clippy::inherent_to_string,
clippy::new_without_default,
clippy::unnecessary_wraps,
clippy::field_reassign_with_default,
clippy::manual_find,
clippy::unnecessary_lazy_evaluations,
clippy::should_implement_trait,
clippy::missing_safety_doc,
clippy::unusual_byte_groupings,
clippy::bool_assert_comparison,
clippy::zero_prefixed_literal,
clippy::await_holding_lock,
clippy::manual_saturating_arithmetic,
clippy::explicit_counter_loop,
clippy::needless_lifetimes,
clippy::single_component_path_imports,
clippy::uninlined_format_args,
clippy::iter_cloned_collect,
clippy::manual_str_repeat,
clippy::excessive_precision,
clippy::precedence,
clippy::unnecessary_literal_unwrap
)]
mod iterator_encode_advanced_tests {
use oxicode::{
config, decode_iter_from_slice, decode_iter_from_slice_with_config, encode_iter_to_vec,
encode_iter_to_vec_with_config,
};
#[test]
fn encode_empty_iter_is_single_varint_zero_byte() {
let encoded =
encode_iter_to_vec(std::iter::empty::<u32>()).expect("encode empty iter failed");
assert_eq!(
encoded.len(),
1,
"empty iterator must encode to exactly 1 byte (varint 0)"
);
assert_eq!(
encoded[0], 0x00,
"the single byte must be 0x00 (varint encoding of 0)"
);
}
#[test]
fn encode_three_small_u32s_byte_count() {
let items = [1u32, 2u32, 3u32];
let encoded = encode_iter_to_vec(items.iter().copied()).expect("encode [1,2,3] u32 failed");
assert_eq!(
encoded.len(),
4,
"encoding [1u32,2u32,3u32] must be exactly 4 bytes"
);
}
#[test]
fn decode_iter_five_items_collect_and_verify() {
let source: Vec<u32> = vec![10, 20, 30, 40, 50];
let encoded = oxicode::encode_to_vec(&source).expect("encode 5 u32s failed");
let collected: Vec<u32> = decode_iter_from_slice::<u32>(&encoded)
.expect("decode_iter init for 5 items failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect 5 u32 items failed");
assert_eq!(
collected, source,
"decoded 5 items must exactly match original"
);
}
#[test]
fn decode_iter_truncated_bytes_yields_error() {
let source: Vec<u64> = vec![1, 2, 3, 4, 5, 6, 7, 8];
let encoded = oxicode::encode_to_vec(&source).expect("encode 8 u64s failed");
let truncated = &encoded[..5];
let had_error = match decode_iter_from_slice::<u64>(truncated) {
Err(_) => true,
Ok(iter) => {
let results: Vec<_> = iter.collect();
results.iter().any(|r| r.is_err()) || results.len() < source.len()
}
};
assert!(
had_error,
"truncated encoded bytes must result in an error or fewer items than expected"
);
}
#[test]
fn encode_decode_iter_mixed_string_sizes() {
let items: Vec<String> = vec![
String::new(), "a".to_string(), "hello".to_string(), "a".repeat(100), "unicode: \u{1F600}".to_string(), ];
let encoded =
encode_iter_to_vec(items.iter().cloned()).expect("encode mixed-size strings failed");
let decoded: Vec<String> = decode_iter_from_slice::<String>(&encoded)
.expect("decode_iter init for mixed strings failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect mixed strings failed");
assert_eq!(
decoded, items,
"mixed-size string roundtrip must preserve all items exactly"
);
}
#[test]
fn encode_decode_iter_string_diverse_set() {
let items: Vec<String> = vec![
"foo".to_string(),
"bar".to_string(),
"baz".to_string(),
"qux quux".to_string(),
"the quick brown fox".to_string(),
];
let encoded =
encode_iter_to_vec(items.iter().cloned()).expect("encode diverse strings failed");
let decoded: Vec<String> = decode_iter_from_slice::<String>(&encoded)
.expect("decode_iter init for diverse strings failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect diverse strings failed");
assert_eq!(decoded, items);
}
#[test]
fn encode_1000_items_verify_count_via_decode_iter() {
let encoded = encode_iter_to_vec(0u32..1000).expect("encode 0..1000 u32 failed");
let count = decode_iter_from_slice::<u32>(&encoded)
.expect("decode_iter init for 1000 items failed")
.count();
assert_eq!(count, 1000, "decoded count must be exactly 1000");
}
#[test]
fn encode_iter_then_decode_iter_is_identity() {
let original: Vec<i64> = vec![-1000, -1, 0, 1, 1000, i64::MAX, i64::MIN];
let encoded = encode_iter_to_vec(original.iter().copied()).expect("encode i64 iter failed");
let decoded: Vec<i64> = decode_iter_from_slice::<i64>(&encoded)
.expect("decode_iter init for i64 identity test failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect i64 identity items failed");
assert_eq!(
decoded, original,
"encode-then-decode must be a lossless identity transform"
);
}
#[test]
fn decode_iter_non_consuming_byte_slice() {
let source: Vec<u32> = vec![7, 14, 21, 28, 35];
let encoded =
oxicode::encode_to_vec(&source).expect("encode for non-consuming test failed");
let first_pass: Vec<u32> = decode_iter_from_slice::<u32>(&encoded)
.expect("first decode_iter init failed")
.collect::<Result<Vec<_>, _>>()
.expect("first collect failed");
let second_pass: Vec<u32> = decode_iter_from_slice::<u32>(&encoded)
.expect("second decode_iter init failed")
.collect::<Result<Vec<_>, _>>()
.expect("second collect failed");
assert_eq!(
first_pass, second_pass,
"byte slice must be reusable; both passes must yield identical results"
);
assert_eq!(first_pass, source);
}
#[test]
fn encode_chained_iter_produces_unified_sequence() {
let first_half = 0u32..5;
let second_half = 5u32..10;
let chained = first_half.chain(second_half);
let encoded = encode_iter_to_vec(chained).expect("encode chained iter failed");
let decoded: Vec<u32> = decode_iter_from_slice::<u32>(&encoded)
.expect("decode_iter init for chained sequence failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect chained items failed");
let expected: Vec<u32> = (0u32..10).collect();
assert_eq!(
decoded, expected,
"chained iterators must produce a single unified sequence"
);
}
#[test]
fn decode_iter_filter_map_even_only() {
let source: Vec<u32> = (0u32..20).collect();
let encoded = oxicode::encode_to_vec(&source).expect("encode 0..20 failed");
let evens: Vec<u32> = decode_iter_from_slice::<u32>(&encoded)
.expect("decode_iter init for filter_map test failed")
.filter_map(|r| r.ok().filter(|v| v % 2 == 0))
.collect();
let expected: Vec<u32> = (0u32..20).filter(|v| v % 2 == 0).collect();
assert_eq!(
evens, expected,
"filter_map on decoded iterator must yield only even numbers"
);
}
#[test]
fn decode_iter_take_n_items() {
let source: Vec<u32> = (100u32..200).collect();
let encoded = oxicode::encode_to_vec(&source).expect("encode 100-item source failed");
let first_five: Vec<u32> = decode_iter_from_slice::<u32>(&encoded)
.expect("decode_iter init for take test failed")
.take(5)
.collect::<Result<Vec<_>, _>>()
.expect("collect first 5 items failed");
assert_eq!(first_five.len(), 5, "take(5) must yield exactly 5 items");
assert_eq!(
first_five,
vec![100u32, 101, 102, 103, 104],
"take(5) must yield the first 5 items in order"
);
}
#[test]
fn encode_decode_iter_nested_vec() {
let items: Vec<Vec<u32>> = vec![
vec![1, 2, 3],
vec![],
vec![10, 20, 30, 40, 50],
vec![u32::MAX],
];
let encoded =
encode_iter_to_vec(items.iter().cloned()).expect("encode nested Vec iter failed");
let decoded: Vec<Vec<u32>> = decode_iter_from_slice::<Vec<u32>>(&encoded)
.expect("decode_iter init for nested Vec failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect nested Vec items failed");
assert_eq!(
decoded, items,
"nested Vec<u32> roundtrip via iterator must preserve all items"
);
}
#[test]
fn encode_iter_to_vec_with_fixed_int_config() {
let items = [1u32, 2u32, 3u32];
let cfg = config::standard().with_fixed_int_encoding();
let encoded = encode_iter_to_vec_with_config(items.iter().copied(), cfg)
.expect("encode with fixed int config failed");
let decoded: Vec<u32> = decode_iter_from_slice_with_config::<u32, _>(&encoded, cfg)
.expect("decode_iter init with fixed config failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect with fixed config failed");
assert_eq!(
decoded,
vec![1u32, 2u32, 3u32],
"fixed-int config encode/decode must roundtrip correctly"
);
assert_eq!(
encoded.len(),
8 + 3 * 4,
"with fixed int encoding: 8-byte length prefix + 3 × 4 bytes = 20 bytes total"
);
}
#[test]
fn encode_iter_first_bytes_are_varint_item_count() {
let items: Vec<u32> = vec![100u32, 200u32, 50u32, 75u32, 25u32]; let encoded =
encode_iter_to_vec(items.iter().copied()).expect("encode 5 u32s for format test");
assert_eq!(
encoded[0], 0x05,
"first byte must be varint(5) = 0x05 for a 5-item sequence"
);
}
#[test]
fn decode_iter_stops_after_exact_item_count() {
let source: Vec<u16> = vec![10, 20, 30, 40, 50, 60, 70];
let encoded = oxicode::encode_to_vec(&source).expect("encode 7 u16s failed");
let mut iter = decode_iter_from_slice::<u16>(&encoded)
.expect("decode_iter init for exact count test failed");
let mut collected = Vec::new();
for result in iter.by_ref() {
collected.push(result.expect("item decode failed in exact count test"));
}
assert!(
iter.next().is_none(),
"iterator must return None after all items are consumed"
);
assert_eq!(
collected.len(),
7,
"exactly 7 items must be decoded — no more, no fewer"
);
assert_eq!(collected, source);
}
#[test]
fn encode_decode_iter_large_256_byte_strings() {
let large_string = "x".repeat(256);
let items: Vec<String> = vec![large_string.clone(), large_string.clone(), large_string];
let encoded =
encode_iter_to_vec(items.iter().cloned()).expect("encode large strings failed");
let decoded: Vec<String> = decode_iter_from_slice::<String>(&encoded)
.expect("decode_iter init for large strings failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect large strings failed");
assert_eq!(decoded, items, "256-byte strings must roundtrip correctly");
for s in &decoded {
assert_eq!(
s.len(),
256,
"each decoded string must be exactly 256 bytes"
);
}
}
#[test]
fn encode_decode_iter_booleans() {
let items: Vec<bool> = vec![true, false, true, true, false, false, true];
let encoded =
encode_iter_to_vec(items.iter().copied()).expect("encode bool iterator failed");
let decoded: Vec<bool> = decode_iter_from_slice::<bool>(&encoded)
.expect("decode_iter init for booleans failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect booleans failed");
assert_eq!(
decoded, items,
"boolean iterator roundtrip must preserve all values"
);
}
#[test]
fn encode_decode_iter_f64_extreme_values() {
let items: Vec<f64> = vec![
0.0_f64,
-0.0_f64,
f64::MAX,
f64::MIN,
f64::MIN_POSITIVE,
f64::INFINITY,
f64::NEG_INFINITY,
1.23456789012345e100,
-9.87654321098765e-100,
];
let encoded =
encode_iter_to_vec(items.iter().copied()).expect("encode f64 extreme values failed");
let decoded: Vec<f64> = decode_iter_from_slice::<f64>(&encoded)
.expect("decode_iter init for f64 extremes failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect f64 extreme values failed");
assert_eq!(
decoded.len(),
items.len(),
"f64 extreme value iterator must decode the same number of items"
);
for (i, (got, expected)) in decoded.iter().zip(items.iter()).enumerate() {
assert_eq!(
got.to_bits(),
expected.to_bits(),
"f64 at index {} must have identical bit pattern after roundtrip",
i
);
}
}
#[test]
fn encode_decode_iter_option_u32_mixed() {
let items: Vec<Option<u32>> =
vec![Some(0), None, Some(u32::MAX), None, Some(42), Some(1), None];
let encoded =
encode_iter_to_vec(items.iter().copied()).expect("encode Option<u32> iter failed");
let decoded: Vec<Option<u32>> = decode_iter_from_slice::<Option<u32>>(&encoded)
.expect("decode_iter init for Option<u32> failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect Option<u32> items failed");
assert_eq!(
decoded, items,
"Option<u32> mix with Some/None must roundtrip exactly"
);
}
#[test]
fn encode_decode_iter_u32_string_tuple() {
let items: Vec<(u32, String)> = vec![
(0, "zero".to_string()),
(1, "one".to_string()),
(42, "forty-two".to_string()),
(u32::MAX, "max".to_string()),
(100, String::new()),
];
let encoded =
encode_iter_to_vec(items.iter().cloned()).expect("encode (u32,String) iter failed");
let decoded: Vec<(u32, String)> = decode_iter_from_slice::<(u32, String)>(&encoded)
.expect("decode_iter init for (u32,String) failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect (u32,String) tuples failed");
assert_eq!(
decoded, items,
"(u32, String) tuple iterator roundtrip must preserve all tuples exactly"
);
}
#[test]
fn decode_iter_stops_after_exactly_n_items_with_trailing_data() {
let source: Vec<u32> = vec![11, 22, 33, 44, 55];
let mut encoded = oxicode::encode_to_vec(&source).expect("encode 5 u32s failed");
let trailing: Vec<u8> = vec![0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xFF];
let original_len = encoded.len();
encoded.extend_from_slice(&trailing);
let decoded: Vec<u32> = decode_iter_from_slice::<u32>(&encoded)
.expect("decode_iter init with trailing data failed")
.collect::<Result<Vec<_>, _>>()
.expect("collect items with trailing data failed");
assert_eq!(
decoded.len(),
5,
"iterator must decode exactly 5 items declared in the length prefix"
);
assert_eq!(
decoded, source,
"decoded values must match original, ignoring trailing bytes"
);
let _ = original_len; }
}