use crate::common::cpp_essentials::ByteMatrix;
use crate::qrcode::encoder::mask_util;
#[test]
fn testApplyMaskPenaltyRule1() {
let mut matrix = ByteMatrix::new(4, 1);
matrix.set(0, 0, 0);
matrix.set(1, 0, 0);
matrix.set(2, 0, 0);
matrix.set(3, 0, 0);
assert_eq!(0, mask_util::applyMaskPenaltyRule1(&matrix));
let mut matrix = ByteMatrix::new(6, 1);
matrix.set(0, 0, 0);
matrix.set(1, 0, 0);
matrix.set(2, 0, 0);
matrix.set(3, 0, 0);
matrix.set(4, 0, 0);
matrix.set(5, 0, 1);
assert_eq!(3, mask_util::applyMaskPenaltyRule1(&matrix));
matrix.set(5, 0, 0);
assert_eq!(4, mask_util::applyMaskPenaltyRule1(&matrix));
let mut matrix = ByteMatrix::new(1, 6);
matrix.set(0, 0, 0);
matrix.set(0, 1, 0);
matrix.set(0, 2, 0);
matrix.set(0, 3, 0);
matrix.set(0, 4, 0);
matrix.set(0, 5, 1);
assert_eq!(3, mask_util::applyMaskPenaltyRule1(&matrix));
matrix.set(0, 5, 0);
assert_eq!(4, mask_util::applyMaskPenaltyRule1(&matrix));
}
#[test]
fn testApplyMaskPenaltyRule2() {
let mut matrix = ByteMatrix::new(1, 1);
matrix.set(0, 0, 0);
assert_eq!(0, mask_util::applyMaskPenaltyRule2(&matrix));
let mut matrix = ByteMatrix::new(2, 2);
matrix.set(0, 0, 0);
matrix.set(1, 0, 0);
matrix.set(0, 1, 0);
matrix.set(1, 1, 1);
assert_eq!(0, mask_util::applyMaskPenaltyRule2(&matrix));
let mut matrix = ByteMatrix::new(2, 2);
matrix.set(0, 0, 0);
matrix.set(1, 0, 0);
matrix.set(0, 1, 0);
matrix.set(1, 1, 0);
assert_eq!(3, mask_util::applyMaskPenaltyRule2(&matrix));
let mut matrix = ByteMatrix::new(3, 3);
matrix.set(0, 0, 0);
matrix.set(1, 0, 0);
matrix.set(2, 0, 0);
matrix.set(0, 1, 0);
matrix.set(1, 1, 0);
matrix.set(2, 1, 0);
matrix.set(0, 2, 0);
matrix.set(1, 2, 0);
matrix.set(2, 2, 0);
assert_eq!(3 * 4, mask_util::applyMaskPenaltyRule2(&matrix));
}
#[test]
fn testApplyMaskPenaltyRule3() {
let mut matrix = ByteMatrix::new(11, 1);
matrix.set(0, 0, 0);
matrix.set(1, 0, 0);
matrix.set(2, 0, 0);
matrix.set(3, 0, 0);
matrix.set(4, 0, 1);
matrix.set(5, 0, 0);
matrix.set(6, 0, 1);
matrix.set(7, 0, 1);
matrix.set(8, 0, 1);
matrix.set(9, 0, 0);
matrix.set(10, 0, 1);
assert_eq!(40, mask_util::applyMaskPenaltyRule3(&matrix));
let mut matrix = ByteMatrix::new(11, 1);
matrix.set(0, 0, 1);
matrix.set(1, 0, 0);
matrix.set(2, 0, 1);
matrix.set(3, 0, 1);
matrix.set(4, 0, 1);
matrix.set(5, 0, 0);
matrix.set(6, 0, 1);
matrix.set(7, 0, 0);
matrix.set(8, 0, 0);
matrix.set(9, 0, 0);
matrix.set(10, 0, 0);
assert_eq!(40, mask_util::applyMaskPenaltyRule3(&matrix));
let mut matrix = ByteMatrix::new(7, 1);
matrix.set(0, 0, 1);
matrix.set(1, 0, 0);
matrix.set(2, 0, 1);
matrix.set(3, 0, 1);
matrix.set(4, 0, 1);
matrix.set(5, 0, 0);
matrix.set(6, 0, 1);
assert_eq!(0, mask_util::applyMaskPenaltyRule3(&matrix));
let mut matrix = ByteMatrix::new(1, 11);
matrix.set(0, 0, 0);
matrix.set(0, 1, 0);
matrix.set(0, 2, 0);
matrix.set(0, 3, 0);
matrix.set(0, 4, 1);
matrix.set(0, 5, 0);
matrix.set(0, 6, 1);
matrix.set(0, 7, 1);
matrix.set(0, 8, 1);
matrix.set(0, 9, 0);
matrix.set(0, 10, 1);
assert_eq!(40, mask_util::applyMaskPenaltyRule3(&matrix));
let mut matrix = ByteMatrix::new(1, 11);
matrix.set(0, 0, 1);
matrix.set(0, 1, 0);
matrix.set(0, 2, 1);
matrix.set(0, 3, 1);
matrix.set(0, 4, 1);
matrix.set(0, 5, 0);
matrix.set(0, 6, 1);
matrix.set(0, 7, 0);
matrix.set(0, 8, 0);
matrix.set(0, 9, 0);
matrix.set(0, 10, 0);
let mut matrix = ByteMatrix::new(1, 7);
matrix.set(0, 0, 1);
matrix.set(0, 1, 0);
matrix.set(0, 2, 1);
matrix.set(0, 3, 1);
matrix.set(0, 4, 1);
matrix.set(0, 5, 0);
matrix.set(0, 6, 1);
assert_eq!(0, mask_util::applyMaskPenaltyRule3(&matrix));
}
#[test]
fn testApplyMaskPenaltyRule4() {
let mut matrix = ByteMatrix::new(1, 1);
matrix.set(0, 0, 0);
assert_eq!(100, mask_util::applyMaskPenaltyRule4(&matrix));
let mut matrix = ByteMatrix::new(2, 1);
matrix.set(0, 0, 0);
matrix.set(0, 0, 1);
assert_eq!(0, mask_util::applyMaskPenaltyRule4(&matrix));
let mut matrix = ByteMatrix::new(6, 1);
matrix.set(0, 0, 0);
matrix.set(1, 0, 1);
matrix.set(2, 0, 1);
matrix.set(3, 0, 1);
matrix.set(4, 0, 1);
matrix.set(5, 0, 0);
assert_eq!(30, mask_util::applyMaskPenaltyRule4(&matrix));
}
fn testGetDataMaskBitInternal(maskPattern: u32, expected: &[Vec<u32>]) -> bool {
for x in 0..6 {
for (y, expectation) in expected.iter().enumerate().take(6) {
if (expectation[x] == 1)
!= mask_util::getDataMaskBit(maskPattern, x as u32, y as u32)
.expect("should never fail")
{
return false;
}
}
}
true
}
#[test]
fn testGetDataMaskBit() {
let mask0 = vec![
vec![1, 0, 1, 0, 1, 0],
vec![0, 1, 0, 1, 0, 1],
vec![1, 0, 1, 0, 1, 0],
vec![0, 1, 0, 1, 0, 1],
vec![1, 0, 1, 0, 1, 0],
vec![0, 1, 0, 1, 0, 1],
];
assert!(testGetDataMaskBitInternal(0, &mask0));
let mask1 = vec![
vec![1, 1, 1, 1, 1, 1],
vec![0, 0, 0, 0, 0, 0],
vec![1, 1, 1, 1, 1, 1],
vec![0, 0, 0, 0, 0, 0],
vec![1, 1, 1, 1, 1, 1],
vec![0, 0, 0, 0, 0, 0],
];
assert!(testGetDataMaskBitInternal(1, &mask1));
let mask2 = vec![
vec![1, 0, 0, 1, 0, 0],
vec![1, 0, 0, 1, 0, 0],
vec![1, 0, 0, 1, 0, 0],
vec![1, 0, 0, 1, 0, 0],
vec![1, 0, 0, 1, 0, 0],
vec![1, 0, 0, 1, 0, 0],
];
assert!(testGetDataMaskBitInternal(2, &mask2));
let mask3 = vec![
vec![1, 0, 0, 1, 0, 0],
vec![0, 0, 1, 0, 0, 1],
vec![0, 1, 0, 0, 1, 0],
vec![1, 0, 0, 1, 0, 0],
vec![0, 0, 1, 0, 0, 1],
vec![0, 1, 0, 0, 1, 0],
];
assert!(testGetDataMaskBitInternal(3, &mask3));
let mask4 = vec![
vec![1, 1, 1, 0, 0, 0],
vec![1, 1, 1, 0, 0, 0],
vec![0, 0, 0, 1, 1, 1],
vec![0, 0, 0, 1, 1, 1],
vec![1, 1, 1, 0, 0, 0],
vec![1, 1, 1, 0, 0, 0],
];
assert!(testGetDataMaskBitInternal(4, &mask4));
let mask5 = vec![
vec![1, 1, 1, 1, 1, 1],
vec![1, 0, 0, 0, 0, 0],
vec![1, 0, 0, 1, 0, 0],
vec![1, 0, 1, 0, 1, 0],
vec![1, 0, 0, 1, 0, 0],
vec![1, 0, 0, 0, 0, 0],
];
assert!(testGetDataMaskBitInternal(5, &mask5));
let mask6 = vec![
vec![1, 1, 1, 1, 1, 1],
vec![1, 1, 1, 0, 0, 0],
vec![1, 1, 0, 1, 1, 0],
vec![1, 0, 1, 0, 1, 0],
vec![1, 0, 1, 1, 0, 1],
vec![1, 0, 0, 0, 1, 1],
];
assert!(testGetDataMaskBitInternal(6, &mask6));
let mask7 = vec![
vec![1, 0, 1, 0, 1, 0],
vec![0, 0, 0, 1, 1, 1],
vec![1, 0, 0, 0, 1, 1],
vec![0, 1, 0, 1, 0, 1],
vec![1, 1, 1, 0, 0, 0],
vec![0, 1, 1, 1, 0, 0],
];
assert!(testGetDataMaskBitInternal(7, &mask7));
}