Files
rxing/src/qrcode/encoder/MatrixUtilTestCase.rs
2022-10-02 11:42:22 -05:00

350 lines
12 KiB
Rust

/*
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
use crate::{
common::BitArray,
qrcode::{
decoder::{ErrorCorrectionLevel, Version},
encoder::matrix_util,
},
};
use super::ByteMatrix;
/**
* @author satorux@google.com (Satoru Takabayashi) - creator
* @author mysen@google.com (Chris Mysen) - ported from C++
*/
#[test]
fn testToString() {
let mut array = ByteMatrix::new(3, 3);
array.set(0, 0, 0);
array.set(1, 0, 1);
array.set(2, 0, 0);
array.set(0, 1, 1);
array.set(1, 1, 0);
array.set(2, 1, 1);
array.set(0, 2, -1i8 as u8);
array.set(1, 2, -1i8 as u8);
array.set(2, 2, -1i8 as u8);
let expected = " 0 1 0\n 1 0 1\n \n";
assert_eq!(expected, array.to_string());
}
#[test]
fn testClearMatrix() {
let mut matrix = ByteMatrix::new(2, 2);
matrix_util::clearMatrix(&mut matrix);
assert_eq!(-1i8 as u8, matrix.get(0, 0));
assert_eq!(-1i8 as u8, matrix.get(1, 0));
assert_eq!(-1i8 as u8, matrix.get(0, 1));
assert_eq!(-1i8 as u8, matrix.get(1, 1));
}
#[test]
fn test_embed_basic_patterns1() {
// Version 1.
let mut matrix = ByteMatrix::new(21, 21);
matrix_util::clearMatrix(&mut matrix);
matrix_util::embedBasicPatterns(
Version::getVersionForNumber(1).expect("version ok"),
&mut matrix,
)
.expect("op ok");
let expected = r" 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1
1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1
1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1
1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1
0
1
0
1
0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 0
1 0 0 0 0 0 1 0
1 0 1 1 1 0 1 0
1 0 1 1 1 0 1 0
1 0 1 1 1 0 1 0
1 0 0 0 0 0 1 0
1 1 1 1 1 1 1 0
";
assert_eq!(expected, matrix.to_string());
}
#[test]
fn testEmbedBasicPatterns2() {
// Version 2. Position adjustment pattern should apppear at right
// bottom corner.
let mut matrix = ByteMatrix::new(25, 25);
matrix_util::clearMatrix(&mut matrix);
matrix_util::embedBasicPatterns(
Version::getVersionForNumber(2).expect("version ok"),
&mut matrix,
)
.expect("op ok");
let expected = r" 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1
1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1
1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1
1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1
0
1
0
1
0
1
0
1 1 1 1 1 1
0 0 0 0 0 0 0 0 1 1 0 0 0 1
1 1 1 1 1 1 1 0 1 0 1 0 1
1 0 0 0 0 0 1 0 1 0 0 0 1
1 0 1 1 1 0 1 0 1 1 1 1 1
1 0 1 1 1 0 1 0
1 0 1 1 1 0 1 0
1 0 0 0 0 0 1 0
1 1 1 1 1 1 1 0
";
assert_eq!(expected, matrix.to_string());
}
#[test]
fn testEmbedTypeInfo() {
// Type info bits = 100000011001110.
let mut matrix = ByteMatrix::new(21, 21);
matrix_util::clearMatrix(&mut matrix);
matrix_util::embedTypeInfo(&ErrorCorrectionLevel::M, 5, &mut matrix).expect("op ok");
let expected = r" 0
1
1
1
0
0
1
1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0
0
0
0
0
0
0
1
";
assert_eq!(expected, matrix.to_string());
}
#[test]
fn testEmbedVersionInfo() {
// Version info bits = 000111 110010 010100
// Actually, version 7 QR Code has 45x45 matrix but we use 21x21 here
// since 45x45 matrix is too big to depict.
let mut matrix = ByteMatrix::new(21, 21);
matrix_util::clearMatrix(&mut matrix);
matrix_util::maybeEmbedVersionInfo(
Version::getVersionForNumber(7).expect("Version"),
&mut matrix,
)
.expect("op ok");
let expected = r" 0 0 1
0 1 0
0 1 0
0 1 1
1 1 1
0 0 0
0 0 0 0 1 0
0 1 1 1 1 0
1 0 0 1 1 0
";
assert_eq!(expected, matrix.to_string());
}
#[test]
fn testEmbedDataBits() {
// Cells other than basic patterns should be filled with zero.
let mut matrix = ByteMatrix::new(21, 21);
matrix_util::clearMatrix(&mut matrix);
matrix_util::embedBasicPatterns(
Version::getVersionForNumber(1).expect("version"),
&mut matrix,
)
.expect("op ok");
let bits = BitArray::new();
matrix_util::embedDataBits(&bits, -1, &mut matrix);
let expected = r" 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1
1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1
1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1
1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1
1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
";
assert_eq!(expected, matrix.to_string());
}
#[test]
fn testBuildMatrix() {
// From http://www.swetake.com/qr/qr7.html
let bytes = [
32, 65, 205, 69, 41, 220, 46, 128, 236, 42, 159, 74, 221, 244, 169, 239, 150, 138, 70, 237,
85, 224, 96, 74, 219, 61,
];
let mut bits = BitArray::new();
for c in bytes {
// for (char c: bytes) {
bits.appendBits(c, 8);
}
let mut matrix = ByteMatrix::new(21, 21);
matrix_util::buildMatrix(
&bits,
&ErrorCorrectionLevel::H,
Version::getVersionForNumber(1).expect("version"), // Version 1
3, // Mask pattern 3
&mut matrix,
);
let expected = r" 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1
1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1
1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1
1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1
1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1
1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0
0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0
1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0
1 1 1 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 1 0
1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 0
0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 1
0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1
1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0
1 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0
1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1
1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0
1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0
1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0
1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 0 1 0
";
assert_eq!(expected, matrix.to_string());
}
#[test]
fn testFindMSBSet() {
assert_eq!(0, matrix_util::findMSBSet(0));
assert_eq!(1, matrix_util::findMSBSet(1));
assert_eq!(8, matrix_util::findMSBSet(0x80));
assert_eq!(32, matrix_util::findMSBSet(0x80000000));
}
#[test]
fn testCalculateBCHCode() {
// Encoding of type information.
// From Appendix C in JISX0510:2004 (p 65)
assert_eq!(0xdc, matrix_util::calculateBCHCode(5, 0x537).expect("ok"));
// From http://www.swetake.com/qr/qr6.html
assert_eq!(
0x1c2,
matrix_util::calculateBCHCode(0x13, 0x537).expect("ok")
);
// From http://www.swetake.com/qr/qr11.html
assert_eq!(
0x214,
matrix_util::calculateBCHCode(0x1b, 0x537).expect("ok")
);
// Encoding of version information.
// From Appendix D in JISX0510:2004 (p 68)
assert_eq!(0xc94, matrix_util::calculateBCHCode(7, 0x1f25).expect("ok"));
assert_eq!(0x5bc, matrix_util::calculateBCHCode(8, 0x1f25).expect("ok"));
assert_eq!(0xa99, matrix_util::calculateBCHCode(9, 0x1f25).expect("ok"));
assert_eq!(
0x4d3,
matrix_util::calculateBCHCode(10, 0x1f25).expect("ok")
);
assert_eq!(
0x9a6,
matrix_util::calculateBCHCode(20, 0x1f25).expect("ok")
);
assert_eq!(
0xd75,
matrix_util::calculateBCHCode(30, 0x1f25).expect("ok")
);
assert_eq!(
0xc69,
matrix_util::calculateBCHCode(40, 0x1f25).expect("ok")
);
}
// We don't test a lot of cases in this function since we've already
// tested them in TEST(calculateBCHCode).
#[test]
fn testMakeVersionInfoBits() {
// From Appendix D in JISX0510:2004 (p 68)
let mut bits = BitArray::new();
matrix_util::makeVersionInfoBits(Version::getVersionForNumber(7).expect("version"), &mut bits)
.expect("op ok");
assert_eq!(" ...XXXXX ..X..X.X ..", bits.to_string());
}
// We don't test a lot of cases in this function since we've already
// tested them in TEST(calculateBCHCode).
#[test]
fn testMakeTypeInfoInfoBits() {
// From Appendix C in JISX0510:2004 (p 65)
let mut bits = BitArray::new();
matrix_util::makeTypeInfoBits(&ErrorCorrectionLevel::M, 5, &mut bits);
assert_eq!(" X......X X..XXX.", bits.to_string());
}