use justjp2::quantize::*;
#[test]
fn no_quantization_passthrough() {
let mut coeffs = vec![100, -200, 300, 0, -50];
let original = coeffs.clone();
no_quantize(&mut coeffs, 0);
assert_eq!(coeffs, original);
let mut coeffs = vec![100, -200, 300, 0, -52];
no_quantize(&mut coeffs, 2);
assert_eq!(coeffs, vec![25, -50, 75, 0, -13]);
}
#[test]
fn scalar_quantize_dequantize() {
let original = vec![1000, -2000, 500, -750, 0, 3000];
let mut coeffs = original.clone();
let ss = StepSize {
exponent: 10,
mantissa: 512,
};
let guard_bits = 2;
quantize_band(&mut coeffs, &ss, guard_bits);
assert_eq!(coeffs[4], 0);
dequantize_band(&mut coeffs, &ss, guard_bits);
for i in 0..original.len() {
if original[i] == 0 {
assert_eq!(coeffs[i], 0);
} else if original[i] > 0 {
assert!(coeffs[i] > 0, "Sign should be preserved for positive values");
} else {
assert!(coeffs[i] < 0, "Sign should be preserved for negative values");
}
}
}
#[test]
fn stepsize_encode_decode() {
let test_cases = [
(0u8, 0u16),
(31, 2047), (15, 1024),
(8, 256),
(1, 1),
];
for (exp, mant) in &test_cases {
let ss = StepSize {
exponent: *exp,
mantissa: *mant,
};
let encoded = ss.to_u16();
let decoded = StepSize::from_u16(encoded);
assert_eq!(
ss, decoded,
"Roundtrip failed for exponent={}, mantissa={}",
exp, mant
);
}
}
#[test]
fn calc_stepsizes_5levels() {
let stepsizes = calc_stepsizes(5, 8, false);
assert_eq!(stepsizes.len(), 13);
for ss in &stepsizes {
assert!(ss.exponent < 32, "Exponent should fit in 5 bits");
assert!(ss.mantissa < 2048, "Mantissa should fit in 11 bits");
}
let stepsizes_rev = calc_stepsizes(5, 8, true);
assert_eq!(stepsizes_rev.len(), 13);
}
#[test]
fn guard_bits_effect() {
let mut coeffs_g0 = vec![1024, -512, 256];
let mut coeffs_g2 = vec![1024, -512, 256];
let ss = StepSize {
exponent: 10,
mantissa: 0,
};
quantize_band(&mut coeffs_g0, &ss, 0);
quantize_band(&mut coeffs_g2, &ss, 2);
assert_eq!(coeffs_g0[0], 1);
assert_eq!(coeffs_g2[0], 4);
}
#[test]
fn zero_coefficient() {
let mut coeffs = vec![0];
let ss = StepSize {
exponent: 10,
mantissa: 512,
};
quantize_band(&mut coeffs, &ss, 2);
assert_eq!(coeffs[0], 0);
dequantize_band(&mut coeffs, &ss, 2);
assert_eq!(coeffs[0], 0);
no_quantize(&mut coeffs, 3);
assert_eq!(coeffs[0], 0);
}
#[test]
fn dwt_norms() {
assert!((dwt_getnorm(0, 0) - 1.000).abs() < 1e-6);
assert!((dwt_getnorm(1, 0) - 1.500).abs() < 1e-6);
assert!((dwt_getnorm(0, 1) - 1.038).abs() < 1e-6);
assert!((dwt_getnorm(0, 3) - 0.7186).abs() < 1e-6);
assert!((dwt_getnorm_real(0, 0) - 1.000).abs() < 1e-6);
assert!((dwt_getnorm_real(1, 0) - 1.965).abs() < 1e-6);
assert!((dwt_getnorm_real(0, 1) - 2.022).abs() < 1e-6);
assert!((dwt_getnorm_real(0, 3) - 2.080).abs() < 1e-6);
assert_eq!(dwt_getnorm(3, 1), dwt_getnorm(3, 2));
assert_eq!(dwt_getnorm_real(3, 1), dwt_getnorm_real(3, 2));
let _norm_high = dwt_getnorm(20, 0); let _norm_high = dwt_getnorm_real(20, 1); }
#[test]
fn mct_norms() {
assert!((mct_getnorm(0) - 1.732).abs() < 1e-6);
assert!((mct_getnorm(1) - 0.8292).abs() < 1e-6);
assert!((mct_getnorm(2) - 0.8292).abs() < 1e-6);
assert!((mct_getnorm_real(0) - 1.732).abs() < 1e-6);
assert!((mct_getnorm_real(1) - 1.805).abs() < 1e-6);
assert!((mct_getnorm_real(2) - 1.573).abs() < 1e-6);
}