use crate::common::BitMatrix;
use super::DataMask;
type MaskCondition = fn(u32, u32) -> bool;
#[test]
fn testMask0() {
testMaskAcrossDimensions(DataMask::DATA_MASK_000, |i, j| ((i + j) % 2 == 0));
testMaskAcrossDimensionsU8(0, |i, j| ((i + j) % 2 == 0));
}
#[test]
fn testMask1() {
testMaskAcrossDimensions(DataMask::DATA_MASK_001, |i, _j| i % 2 == 0);
testMaskAcrossDimensionsU8(1, |i, _j| i % 2 == 0);
}
#[test]
fn testMask2() {
testMaskAcrossDimensions(DataMask::DATA_MASK_010, |_i, j| j % 3 == 0);
testMaskAcrossDimensionsU8(2, |_i, j| j % 3 == 0);
}
#[test]
fn testMask3() {
testMaskAcrossDimensions(DataMask::DATA_MASK_011, |i, j| (i + j) % 3 == 0);
testMaskAcrossDimensionsU8(3, |i, j| (i + j) % 3 == 0);
}
#[test]
fn testMask4() {
testMaskAcrossDimensions(DataMask::DATA_MASK_100, |i, j| (i / 2 + j / 3) % 2 == 0);
testMaskAcrossDimensionsU8(4, |i, j| (i / 2 + j / 3) % 2 == 0);
}
#[test]
fn testMask5() {
testMaskAcrossDimensions(DataMask::DATA_MASK_101, |i, j| {
(i * j) % 2 + (i * j) % 3 == 0
});
testMaskAcrossDimensionsU8(5, |i, j| (i * j) % 2 + (i * j) % 3 == 0);
}
#[test]
fn testMask6() {
testMaskAcrossDimensions(DataMask::DATA_MASK_110, |i, j| {
((i * j) % 2 + (i * j) % 3) % 2 == 0
});
testMaskAcrossDimensionsU8(6, |i, j| ((i * j) % 2 + (i * j) % 3) % 2 == 0);
}
#[test]
fn testMask7() {
testMaskAcrossDimensions(DataMask::DATA_MASK_111, |i, j| {
((i + j) % 2 + (i * j) % 3) % 2 == 0
});
testMaskAcrossDimensionsU8(7, |i, j| ((i + j) % 2 + (i * j) % 3) % 2 == 0);
}
fn testMaskAcrossDimensionsU8(mask: u8, condition: MaskCondition) {
testMaskAcrossDimensions(mask.try_into().unwrap(), condition)
}
fn testMaskAcrossDimensions(mask: DataMask, condition: MaskCondition) {
for version in 1..=40 {
let dimension = 17 + 4 * version;
testMask(mask, dimension, condition);
}
}
fn testMask(mask: DataMask, dimension: u32, condition: MaskCondition) {
let mut bits = BitMatrix::with_single_dimension(dimension).expect("new");
mask.unmaskBitMatrix(&mut bits, dimension);
for i in 0..dimension {
for j in 0..dimension {
assert_eq!(condition(i, j), bits.get(j, i), "({i},{j})");
}
}
}