use super::*;
use std::{vec, vec::Vec};
#[test]
fn gbrpf32_frame_try_new_accepts_valid_tight() {
let g = vec![0.0f32; 8 * 4];
let b = vec![0.0f32; 8 * 4];
let r = vec![0.0f32; 8 * 4];
let f = Gbrpf32LeFrame::try_new(&g, &b, &r, 8, 4, 8, 8, 8).expect("valid tight frame");
assert_eq!(f.width(), 8);
assert_eq!(f.height(), 4);
assert_eq!(f.g_stride(), 8);
assert_eq!(f.b_stride(), 8);
assert_eq!(f.r_stride(), 8);
}
#[test]
fn gbrpf32_try_new_accepts_padded_strides() {
let stride: u32 = 16;
let w: u32 = 8;
let h: u32 = 4;
let p = vec![0.0f32; (stride as usize) * (h as usize - 1) + w as usize];
let f = Gbrpf32LeFrame::try_new(&p, &p, &p, w, h, stride, stride, stride)
.expect("padded stride accepted");
assert_eq!(f.g_stride(), 16);
}
#[test]
fn gbrpf32_try_new_accepts_height_one() {
let p = vec![0.0f32; 8];
let f = Gbrpf32LeFrame::try_new(&p, &p, &p, 8, 1, 8, 8, 8).expect("height=1 accepted");
assert_eq!(f.height(), 1);
}
#[test]
fn gbrpf32_frame_try_new_rejects_zero_dimension() {
let p = vec![0.0f32; 16];
assert!(matches!(
Gbrpf32LeFrame::try_new(&p, &p, &p, 0, 4, 8, 8, 8),
Err(GbrFloatFrameError::ZeroDimension(_))
));
assert!(matches!(
Gbrpf32LeFrame::try_new(&p, &p, &p, 8, 0, 8, 8, 8),
Err(GbrFloatFrameError::ZeroDimension(_))
));
}
#[test]
fn gbrpf32_frame_try_new_rejects_stride_below_width() {
let p = vec![0.0f32; 8 * 4];
assert!(matches!(
Gbrpf32LeFrame::try_new(&p, &p, &p, 8, 4, 7, 8, 8),
Err(GbrFloatFrameError::StrideBelowWidth(_))
));
assert!(matches!(
Gbrpf32LeFrame::try_new(&p, &p, &p, 8, 4, 8, 7, 8),
Err(GbrFloatFrameError::StrideBelowWidth(_))
));
assert!(matches!(
Gbrpf32LeFrame::try_new(&p, &p, &p, 8, 4, 8, 8, 7),
Err(GbrFloatFrameError::StrideBelowWidth(_))
));
}
#[test]
fn gbrpf32_frame_try_new_rejects_plane_too_short() {
let short = vec![0.0f32; 16];
let full = vec![0.0f32; 8 * 4];
assert!(matches!(
Gbrpf32LeFrame::try_new(&short, &full, &full, 8, 4, 8, 8, 8),
Err(GbrFloatFrameError::InsufficientPlane(_))
));
assert!(matches!(
Gbrpf32LeFrame::try_new(&full, &short, &full, 8, 4, 8, 8, 8),
Err(GbrFloatFrameError::InsufficientPlane(_))
));
assert!(matches!(
Gbrpf32LeFrame::try_new(&full, &full, &short, 8, 4, 8, 8, 8),
Err(GbrFloatFrameError::InsufficientPlane(_))
));
}
#[test]
fn gbrpf32_frame_try_new_rejects_dimension_overflow() {
let w: u32 = 1 << 16;
let h: u32 = 1 << 15; let p: &[f32] = &[];
assert!(matches!(
Gbrpf32LeFrame::try_new(p, p, p, w, h, w, w, w),
Err(GbrFloatFrameError::DimensionOverflow(_))
));
}
#[test]
fn gbrpf32_try_new_rejects_geometry_overflow() {
#[cfg(target_pointer_width = "32")]
{
let stride: u32 = u32::MAX / 2 + 1;
let _height: u32 = u32::MAX / 2 + 1;
let p: &[f32] = &[];
let small_h: u32 = 3;
assert!(matches!(
Gbrpf32LeFrame::try_new(p, p, p, 1, small_h, stride, stride, stride),
Err(GbrFloatFrameError::GeometryOverflow(_))
));
}
#[cfg(not(target_pointer_width = "32"))]
{
let _ = GbrFloatFrameError::GeometryOverflow(GeometryOverflow::new(0, 0));
}
}
#[test]
fn gbrapf32_frame_try_new_accepts_valid_tight() {
let p = vec![0.0f32; 8 * 4];
let f = Gbrapf32LeFrame::try_new(&p, &p, &p, &p, 8, 4, 8, 8, 8, 8).expect("valid");
assert_eq!(f.width(), 8);
assert_eq!(f.height(), 4);
assert_eq!(f.a_stride(), 8);
}
#[test]
fn gbrapf32_frame_try_new_rejects_zero_dimension() {
let p = vec![0.0f32; 16];
assert!(matches!(
Gbrapf32LeFrame::try_new(&p, &p, &p, &p, 0, 4, 8, 8, 8, 8),
Err(GbrFloatFrameError::ZeroDimension(_))
));
}
#[test]
fn gbrapf32_frame_try_new_rejects_stride_below_width() {
let p = vec![0.0f32; 8 * 4];
assert!(matches!(
Gbrapf32LeFrame::try_new(&p, &p, &p, &p, 8, 4, 8, 8, 8, 7),
Err(GbrFloatFrameError::StrideBelowWidth(_))
));
}
#[test]
fn gbrapf32_frame_try_new_rejects_plane_too_short() {
let short = vec![0.0f32; 16];
let full = vec![0.0f32; 8 * 4];
assert!(matches!(
Gbrapf32LeFrame::try_new(&full, &full, &full, &short, 8, 4, 8, 8, 8, 8),
Err(GbrFloatFrameError::InsufficientPlane(_))
));
}
#[test]
fn gbrapf32_frame_try_new_rejects_dimension_overflow() {
let w: u32 = 1 << 16;
let h: u32 = 1 << 15;
let p: &[f32] = &[];
assert!(matches!(
Gbrapf32LeFrame::try_new(p, p, p, p, w, h, w, w, w, w),
Err(GbrFloatFrameError::DimensionOverflow(_))
));
}
#[test]
fn gbrapf32_try_new_rejects_geometry_overflow() {
#[cfg(target_pointer_width = "32")]
{
let stride: u32 = u32::MAX / 2 + 1;
let p: &[f32] = &[];
assert!(matches!(
Gbrapf32LeFrame::try_new(p, p, p, p, 1, 3, stride, stride, stride, stride),
Err(GbrFloatFrameError::GeometryOverflow(_))
));
}
#[cfg(not(target_pointer_width = "32"))]
{
let _ = GbrFloatFrameError::GeometryOverflow(GeometryOverflow::new(0, 0));
}
}
fn f16_zeros(n: usize) -> Vec<half::f16> {
vec![half::f16::ZERO; n]
}
#[test]
fn gbrpf16_frame_try_new_accepts_valid_tight() {
let p = f16_zeros(8 * 4);
let f = Gbrpf16LeFrame::try_new(&p, &p, &p, 8, 4, 8, 8, 8).expect("valid");
assert_eq!(f.width(), 8);
assert_eq!(f.height(), 4);
assert_eq!(f.g_stride(), 8);
}
#[test]
fn gbrpf16_frame_try_new_rejects_zero_dimension() {
let p = f16_zeros(16);
assert!(matches!(
Gbrpf16LeFrame::try_new(&p, &p, &p, 8, 0, 8, 8, 8),
Err(GbrFloatFrameError::ZeroDimension(_))
));
}
#[test]
fn gbrpf16_frame_try_new_rejects_stride_below_width() {
let p = f16_zeros(8 * 4);
assert!(matches!(
Gbrpf16LeFrame::try_new(&p, &p, &p, 8, 4, 7, 8, 8),
Err(GbrFloatFrameError::StrideBelowWidth(_))
));
assert!(matches!(
Gbrpf16LeFrame::try_new(&p, &p, &p, 8, 4, 8, 7, 8),
Err(GbrFloatFrameError::StrideBelowWidth(_))
));
assert!(matches!(
Gbrpf16LeFrame::try_new(&p, &p, &p, 8, 4, 8, 8, 7),
Err(GbrFloatFrameError::StrideBelowWidth(_))
));
}
#[test]
fn gbrpf16_frame_try_new_rejects_plane_too_short() {
let short = f16_zeros(16);
let full = f16_zeros(8 * 4);
assert!(matches!(
Gbrpf16LeFrame::try_new(&short, &full, &full, 8, 4, 8, 8, 8),
Err(GbrFloatFrameError::InsufficientPlane(_))
));
assert!(matches!(
Gbrpf16LeFrame::try_new(&full, &short, &full, 8, 4, 8, 8, 8),
Err(GbrFloatFrameError::InsufficientPlane(_))
));
assert!(matches!(
Gbrpf16LeFrame::try_new(&full, &full, &short, 8, 4, 8, 8, 8),
Err(GbrFloatFrameError::InsufficientPlane(_))
));
}
#[test]
fn gbrpf16_frame_try_new_rejects_dimension_overflow() {
let w: u32 = 1 << 16;
let h: u32 = 1 << 15;
let p: &[half::f16] = &[];
assert!(matches!(
Gbrpf16LeFrame::try_new(p, p, p, w, h, w, w, w),
Err(GbrFloatFrameError::DimensionOverflow(_))
));
}
#[test]
fn gbrpf16_try_new_rejects_geometry_overflow() {
#[cfg(target_pointer_width = "32")]
{
let stride: u32 = u32::MAX / 2 + 1;
let p: &[half::f16] = &[];
assert!(matches!(
Gbrpf16LeFrame::try_new(p, p, p, 1, 3, stride, stride, stride),
Err(GbrFloatFrameError::GeometryOverflow(_))
));
}
#[cfg(not(target_pointer_width = "32"))]
{
let _ = GbrFloatFrameError::GeometryOverflow(GeometryOverflow::new(0, 0));
}
}
#[test]
fn gbrapf16_frame_try_new_accepts_valid_tight() {
let p = f16_zeros(8 * 4);
let f = Gbrapf16LeFrame::try_new(&p, &p, &p, &p, 8, 4, 8, 8, 8, 8).expect("valid");
assert_eq!(f.width(), 8);
assert_eq!(f.height(), 4);
assert_eq!(f.a_stride(), 8);
}
#[test]
fn gbrapf16_frame_try_new_rejects_zero_dimension() {
let p = f16_zeros(16);
assert!(matches!(
Gbrapf16LeFrame::try_new(&p, &p, &p, &p, 0, 4, 8, 8, 8, 8),
Err(GbrFloatFrameError::ZeroDimension(_))
));
}
#[test]
fn gbrapf16_frame_try_new_rejects_stride_below_width() {
let p = f16_zeros(8 * 4);
assert!(matches!(
Gbrapf16LeFrame::try_new(&p, &p, &p, &p, 8, 4, 8, 8, 8, 7),
Err(GbrFloatFrameError::StrideBelowWidth(_))
));
}
#[test]
fn gbrapf16_frame_try_new_rejects_plane_too_short() {
let short = f16_zeros(16);
let full = f16_zeros(8 * 4);
assert!(matches!(
Gbrapf16LeFrame::try_new(&full, &full, &full, &short, 8, 4, 8, 8, 8, 8),
Err(GbrFloatFrameError::InsufficientPlane(_))
));
}
#[test]
fn gbrapf16_frame_try_new_rejects_dimension_overflow() {
let w: u32 = 1 << 16;
let h: u32 = 1 << 15;
let p: &[half::f16] = &[];
assert!(matches!(
Gbrapf16LeFrame::try_new(p, p, p, p, w, h, w, w, w, w),
Err(GbrFloatFrameError::DimensionOverflow(_))
));
}
#[test]
fn gbrapf16_try_new_rejects_geometry_overflow() {
#[cfg(target_pointer_width = "32")]
{
let stride: u32 = u32::MAX / 2 + 1;
let p: &[half::f16] = &[];
assert!(matches!(
Gbrapf16LeFrame::try_new(p, p, p, p, 1, 3, stride, stride, stride, stride),
Err(GbrFloatFrameError::GeometryOverflow(_))
));
}
#[cfg(not(target_pointer_width = "32"))]
{
let _ = GbrFloatFrameError::GeometryOverflow(GeometryOverflow::new(0, 0));
}
}
#[test]
fn gbrpf32_le_alias_is_be_returns_false() {
let p = vec![0.0f32; 16];
let f = Gbrpf32LeFrame::try_new(&p, &p, &p, 4, 4, 4, 4, 4).unwrap();
assert!(!f.is_be());
}
#[test]
fn gbrpf32_be_alias_constructs_and_is_be() {
let p = vec![0.0f32; 16];
let f = Gbrpf32BeFrame::try_new(&p, &p, &p, 4, 4, 4, 4, 4).unwrap();
assert!(f.is_be());
assert_eq!(f.width(), 4);
assert_eq!(f.height(), 4);
}
#[test]
fn gbrapf32_be_alias_constructs() {
let p = vec![0.0f32; 16];
let f = Gbrapf32BeFrame::try_new(&p, &p, &p, &p, 4, 4, 4, 4, 4, 4).unwrap();
assert!(f.is_be());
}
#[test]
fn gbrpf16_be_alias_constructs() {
let p = vec![half::f16::ZERO; 16];
let f = Gbrpf16BeFrame::try_new(&p, &p, &p, 4, 4, 4, 4, 4).unwrap();
assert!(f.is_be());
}
#[test]
fn gbrapf16_be_alias_constructs() {
let p = vec![half::f16::ZERO; 16];
let f = Gbrapf16BeFrame::try_new(&p, &p, &p, &p, 4, 4, 4, 4, 4, 4).unwrap();
assert!(f.is_be());
}