mirror of
https://github.com/starovoid/rxing.git
synced 2026-07-26 20:32:34 +00:00
350 lines
12 KiB
Rust
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());
|
|
}
|