use zenpixels_convert::adapt::{adapt_for_encode, adapt_for_encode_explicit, convert_buffer};
use zenpixels_convert::policy::{AlphaPolicy, ConvertOptions, DepthPolicy};
use zenpixels_convert::{ConvertError, PixelDescriptor};
use alloc::borrow::Cow;
extern crate alloc;
#[test]
fn strided_buffer_exact_match_strips_padding() {
let data = vec![
100, 150, 200, 50, 100, 150, 0, 0, 10, 20, 30, 40, 50, 60, 0, 0, ];
let desc = PixelDescriptor::RGB8_SRGB;
let result = adapt_for_encode(&data, desc, 2, 2, 8, &[desc]).unwrap();
assert_eq!(result.descriptor, desc);
assert_eq!(result.width, 2);
assert_eq!(result.rows, 2);
assert_eq!(result.data.len(), 12);
assert_eq!(&result.data[..6], &[100, 150, 200, 50, 100, 150]);
assert_eq!(&result.data[6..12], &[10, 20, 30, 40, 50, 60]);
}
#[test]
fn strided_buffer_packed_is_zero_copy() {
let data = vec![100, 150, 200, 50, 100, 150];
let desc = PixelDescriptor::RGB8_SRGB;
let result = adapt_for_encode(&data, desc, 2, 1, 6, &[desc]).unwrap();
assert!(
matches!(result.data, Cow::Borrowed(_)),
"packed exact match should be zero-copy"
);
}
#[test]
fn strided_buffer_conversion_strips_padding() {
let data = vec![100, 150, 200, 50, 100, 150, 0, 0];
let src_desc = PixelDescriptor::RGB8_SRGB;
let dst_desc = PixelDescriptor::RGBA8_SRGB;
let result = adapt_for_encode(&data, src_desc, 2, 1, 8, &[dst_desc]).unwrap();
assert_eq!(result.descriptor, dst_desc);
assert_eq!(result.data.len(), 8);
assert_eq!(&result.data[..4], &[100, 150, 200, 255]);
assert_eq!(&result.data[4..8], &[50, 100, 150, 255]);
}
#[test]
fn explicit_depth_forbid_returns_error() {
let values: [u16; 4] = [25700, 38550, 51400, 65535];
let mut data = vec![0u8; 8];
for (i, &v) in values.iter().enumerate() {
let bytes = v.to_ne_bytes();
data[i * 2] = bytes[0];
data[i * 2 + 1] = bytes[1];
}
let options = ConvertOptions::forbid_lossy().with_alpha_policy(AlphaPolicy::DiscardUnchecked);
let result = adapt_for_encode_explicit(
&data,
PixelDescriptor::RGBA16_SRGB,
1,
1,
8,
&[PixelDescriptor::RGBA8_SRGB],
&options,
);
assert!(result.is_err());
let err = result.unwrap_err().decompose().0;
assert_eq!(err, ConvertError::DepthReductionForbidden);
}
#[test]
fn explicit_alpha_forbid_returns_error() {
let data = vec![100, 150, 200, 255];
let options = ConvertOptions::forbid_lossy().with_depth_policy(DepthPolicy::Round);
let result = adapt_for_encode_explicit(
&data,
PixelDescriptor::RGBA8_SRGB,
1,
1,
4,
&[PixelDescriptor::RGB8_SRGB],
&options,
);
assert!(result.is_err());
let err = result.unwrap_err().decompose().0;
assert_eq!(err, ConvertError::AlphaRemovalForbidden);
}
#[test]
fn explicit_discard_if_opaque_succeeds_when_opaque() {
let data = vec![100, 150, 200, 255, 50, 100, 150, 255];
let options = ConvertOptions::permissive().with_luma(None);
let result = adapt_for_encode_explicit(
&data,
PixelDescriptor::RGBA8_SRGB,
2,
1,
8,
&[PixelDescriptor::RGB8_SRGB],
&options,
);
assert!(result.is_ok());
let adapted = result.unwrap();
assert_eq!(adapted.descriptor, PixelDescriptor::RGB8_SRGB);
assert_eq!(&adapted.data[..3], &[100, 150, 200]);
}
#[test]
fn explicit_discard_if_opaque_fails_when_semitransparent() {
let data = vec![100, 150, 200, 128];
let options = ConvertOptions::permissive().with_luma(None);
let result = adapt_for_encode_explicit(
&data,
PixelDescriptor::RGBA8_SRGB,
1,
1,
4,
&[PixelDescriptor::RGB8_SRGB],
&options,
);
assert!(result.is_err());
let err = result.unwrap_err().decompose().0;
assert_eq!(err, ConvertError::AlphaNotOpaque);
}
#[test]
fn convert_buffer_identity_returns_copy() {
let data = vec![100, 150, 200, 50, 100, 150];
let result = convert_buffer(
&data,
2,
1,
PixelDescriptor::RGB8_SRGB,
PixelDescriptor::RGB8_SRGB,
)
.unwrap();
assert_eq!(result, data);
}
#[test]
fn convert_buffer_multi_row() {
let data = vec![
10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, ];
let result = convert_buffer(
&data,
2,
3,
PixelDescriptor::RGB8_SRGB,
PixelDescriptor::RGBA8_SRGB,
)
.unwrap();
assert_eq!(result.len(), 2 * 3 * 4);
assert_eq!(&result[..4], &[10, 20, 30, 255]);
assert_eq!(&result[20..24], &[160, 170, 180, 255]);
}
#[test]
fn convert_buffer_bgra_to_rgba() {
let data = vec![200, 150, 100, 255]; let result = convert_buffer(
&data,
1,
1,
PixelDescriptor::BGRA8_SRGB,
PixelDescriptor::RGBA8_SRGB,
)
.unwrap();
assert_eq!(result, vec![100, 150, 200, 255]); }
#[test]
fn adapt_empty_supported_returns_error() {
let data = vec![100, 150, 200];
let result = adapt_for_encode(&data, PixelDescriptor::RGB8_SRGB, 1, 1, 3, &[]);
assert!(result.is_err());
assert_eq!(
result.unwrap_err().decompose().0,
ConvertError::EmptyFormatList
);
}
#[test]
fn adapt_explicit_empty_supported_returns_error() {
let data = vec![100, 150, 200];
let options = ConvertOptions::permissive();
let result =
adapt_for_encode_explicit(&data, PixelDescriptor::RGB8_SRGB, 1, 1, 3, &[], &options);
assert!(result.is_err());
}