tuple return makes more sense for picking blk size

This commit is contained in:
Henry Schimke
2022-10-05 10:46:40 -05:00
parent b9383b35f3
commit 9c27185f7b
2 changed files with 67 additions and 83 deletions

View File

@@ -415,7 +415,7 @@ fn testAppendLengthInfo() {
Version::getVersionForNumber(1).unwrap(),
Mode::NUMERIC,
&mut bits,
);
).expect("ok");
assert_eq!(" ........ .X", bits.to_string()); // 10 bits.
let mut bits = BitArray::new();
encoder::appendLengthInfo(
@@ -423,7 +423,7 @@ fn testAppendLengthInfo() {
Version::getVersionForNumber(10).unwrap(),
Mode::ALPHANUMERIC,
&mut bits,
);
).expect("ok");
assert_eq!(" ........ .X.", bits.to_string()); // 11 bits.
let mut bits = BitArray::new();
encoder::appendLengthInfo(
@@ -431,7 +431,7 @@ fn testAppendLengthInfo() {
Version::getVersionForNumber(27).unwrap(),
Mode::BYTE,
&mut bits,
);
).expect("ok");
assert_eq!(" ........ XXXXXXXX", bits.to_string()); // 16 bits.
let mut bits = BitArray::new();
encoder::appendLengthInfo(
@@ -439,7 +439,7 @@ fn testAppendLengthInfo() {
Version::getVersionForNumber(40).unwrap(),
Mode::KANJI,
&mut bits,
);
).expect("ok");
assert_eq!(" ..X..... ....", bits.to_string()); // 12 bits.
}
@@ -453,7 +453,7 @@ fn testAppendBytes() {
Mode::NUMERIC,
&mut bits,
encoder::DEFAULT_BYTE_MODE_ENCODING,
);
).expect("ok");
assert_eq!(" ...X", bits.to_string());
// Should use appendAlphanumericBytes.
// A = 10 = 0xa = 001010 in 6 bits
@@ -463,7 +463,7 @@ fn testAppendBytes() {
Mode::ALPHANUMERIC,
&mut bits,
encoder::DEFAULT_BYTE_MODE_ENCODING,
);
).expect("ok");
assert_eq!(" ..X.X.", bits.to_string());
// Lower letters such as 'a' cannot be encoded in MODE_ALPHANUMERIC.
//try {
@@ -488,7 +488,7 @@ fn testAppendBytes() {
Mode::BYTE,
&mut bits,
encoder::DEFAULT_BYTE_MODE_ENCODING,
);
).expect("ok");
assert_eq!(" .XX....X .XX...X. .XX...XX", bits.to_string());
// Anything can be encoded in QRCode.MODE_8BIT_BYTE.
encoder::appendBytes(
@@ -496,7 +496,7 @@ fn testAppendBytes() {
Mode::BYTE,
&mut bits,
encoder::DEFAULT_BYTE_MODE_ENCODING,
);
).expect("ok");
// Should use appendKanjiBytes.
// 0x93, 0x5f
let mut bits = BitArray::new();
@@ -505,7 +505,7 @@ fn testAppendBytes() {
Mode::KANJI,
&mut bits,
encoder::DEFAULT_BYTE_MODE_ENCODING,
);
).expect("ok");
assert_eq!(" .XX.XX.. XXXXX", bits.to_string());
}
@@ -540,95 +540,82 @@ fn testTerminateBits() {
#[test]
fn testGetNumDataBytesAndNumECBytesForBlockID() {
let mut numDataBytes = vec![0; 1];
let mut numEcBytes = vec![0; 1];
// Version 1-H.
encoder::getNumDataBytesAndNumECBytesForBlockID(
let (numDataBytes,numEcBytes) = encoder::getNumDataBytesAndNumECBytesForBlockID(
26,
9,
1,
0,
&mut numDataBytes,
&mut numEcBytes,
);
assert_eq!(9, numDataBytes[0]);
assert_eq!(17, numEcBytes[0]);
).expect("ok");
assert_eq!(9, numDataBytes);
assert_eq!(17, numEcBytes);
// Version 3-H. 2 blocks.
encoder::getNumDataBytesAndNumECBytesForBlockID(
let (numDataBytes,numEcBytes) =encoder::getNumDataBytesAndNumECBytesForBlockID(
70,
26,
2,
0,
&mut numDataBytes,
&mut numEcBytes,
);
assert_eq!(13, numDataBytes[0]);
assert_eq!(22, numEcBytes[0]);
encoder::getNumDataBytesAndNumECBytesForBlockID(
).expect("ok");
assert_eq!(13, numDataBytes);
assert_eq!(22, numEcBytes);
let (numDataBytes,numEcBytes) =encoder::getNumDataBytesAndNumECBytesForBlockID(
70,
26,
2,
1,
&mut numDataBytes,
&mut numEcBytes,
);
assert_eq!(13, numDataBytes[0]);
assert_eq!(22, numEcBytes[0]);
).expect("ok");
assert_eq!(13, numDataBytes);
assert_eq!(22, numEcBytes);
// Version 7-H. (4 + 1) blocks.
encoder::getNumDataBytesAndNumECBytesForBlockID(
let (numDataBytes,numEcBytes) =encoder::getNumDataBytesAndNumECBytesForBlockID(
196,
66,
5,
0,
&mut numDataBytes,
&mut numEcBytes,
);
assert_eq!(13, numDataBytes[0]);
assert_eq!(26, numEcBytes[0]);
encoder::getNumDataBytesAndNumECBytesForBlockID(
).expect("ok");
assert_eq!(13, numDataBytes);
assert_eq!(26, numEcBytes);
let (numDataBytes,numEcBytes) =encoder::getNumDataBytesAndNumECBytesForBlockID(
196,
66,
5,
4,
&mut numDataBytes,
&mut numEcBytes,
);
assert_eq!(14, numDataBytes[0]);
assert_eq!(26, numEcBytes[0]);
).expect("ok");
assert_eq!(14, numDataBytes);
assert_eq!(26, numEcBytes);
// Version 40-H. (20 + 61) blocks.
encoder::getNumDataBytesAndNumECBytesForBlockID(
let (numDataBytes,numEcBytes) =encoder::getNumDataBytesAndNumECBytesForBlockID(
3706,
1276,
81,
0,
&mut numDataBytes,
&mut numEcBytes,
);
assert_eq!(15, numDataBytes[0]);
assert_eq!(30, numEcBytes[0]);
encoder::getNumDataBytesAndNumECBytesForBlockID(
).expect("ok");
assert_eq!(15, numDataBytes);
assert_eq!(30, numEcBytes);
let (numDataBytes,numEcBytes) =encoder::getNumDataBytesAndNumECBytesForBlockID(
3706,
1276,
81,
20,
&mut numDataBytes,
&mut numEcBytes,
);
assert_eq!(16, numDataBytes[0]);
assert_eq!(30, numEcBytes[0]);
encoder::getNumDataBytesAndNumECBytesForBlockID(
).expect("ok");
assert_eq!(16, numDataBytes);
assert_eq!(30, numEcBytes);
let (numDataBytes,numEcBytes) =encoder::getNumDataBytesAndNumECBytesForBlockID(
3706,
1276,
81,
80,
&mut numDataBytes,
&mut numEcBytes,
);
assert_eq!(16, numDataBytes[0]);
assert_eq!(30, numEcBytes[0]);
).expect("ok");
assert_eq!(16, numDataBytes);
assert_eq!(30, numEcBytes);
}
#[test]
@@ -637,7 +624,7 @@ fn testInterleaveWithECBytes() {
let mut in_ = BitArray::new();
for dataByte in dataBytes {
// for (byte dataByte: dataBytes) {
in_.appendBits(*dataByte, 8);
in_.appendBits(*dataByte, 8).expect("ok");
}
let out = encoder::interleaveWithECBytes(&in_, 26, 9, 1).expect("encode");
let expected = &[
@@ -663,7 +650,7 @@ fn testInterleaveWithECBytes() {
in_ = BitArray::new();
for dataByte in dataBytes {
// for (byte dataByte: dataBytes) {
in_.appendBits(*dataByte, 8);
in_.appendBits(*dataByte, 8).expect("ok");
}
let out = encoder::interleaveWithECBytes(&in_, 134, 62, 4).expect("interleave ok");
@@ -843,7 +830,7 @@ fn testBugInBitVectorNumBytes() {
// for (int x = 0; x < 3518; x++) {
builder.push('0');
}
encoder::encode(&builder, ErrorCorrectionLevel::L);
assert!(encoder::encode(&builder, ErrorCorrectionLevel::L).is_ok());
}
#[test]

View File

@@ -493,9 +493,9 @@ pub fn getNumDataBytesAndNumECBytesForBlockID(
numDataBytes: u32,
numRSBlocks: u32,
blockID: u32,
numDataBytesInBlock: &mut [u32],
numECBytesInBlock: &mut [u32],
) -> Result<(), Exceptions> {
// numDataBytesInBlock: &mut [u32],
// numECBytesInBlock: &mut [u32],
) -> Result<(u32,u32), Exceptions> {
if blockID >= numRSBlocks {
return Err(Exceptions::WriterException("Block ID too large".to_owned()));
// throw new WriterException("Block ID too large");
@@ -540,14 +540,11 @@ pub fn getNumDataBytesAndNumECBytesForBlockID(
// throw new WriterException("Total bytes mismatch");
}
if blockID < numRsBlocksInGroup1 {
numDataBytesInBlock[0] = numDataBytesInGroup1;
numECBytesInBlock[0] = numEcBytesInGroup1;
Ok(if blockID < numRsBlocksInGroup1 {
(numDataBytesInGroup1,numEcBytesInGroup1)
} else {
numDataBytesInBlock[0] = numDataBytesInGroup2;
numECBytesInBlock[0] = numEcBytesInGroup2;
}
Ok(())
(numDataBytesInGroup2,numEcBytesInGroup2)
})
}
/**
@@ -578,26 +575,26 @@ pub fn interleaveWithECBytes(
for i in 0..numRSBlocks {
// for (int i = 0; i < numRSBlocks; ++i) {
let mut numDataBytesInBlock = vec![0; 1]; //new int[1];
let mut numEcBytesInBlock = vec![0; 1]; //new int[1];
getNumDataBytesAndNumECBytesForBlockID(
// let mut numDataBytesInBlock = vec![0; 1]; //new int[1];
// let mut numEcBytesInBlock = vec![0; 1]; //new int[1];
let (numDataBytesInBlock, numEcBytesInBlock) = getNumDataBytesAndNumECBytesForBlockID(
numTotalBytes,
numDataBytes,
numRSBlocks,
i,
&mut numDataBytesInBlock,
&mut numEcBytesInBlock,
// &mut numDataBytesInBlock,
// &mut numEcBytesInBlock,
)?;
let size = numDataBytesInBlock[0];
let size = numDataBytesInBlock;
let mut dataBytes = vec![0u8; size as usize];
bits.toBytes(8 * dataBytesOffset, &mut dataBytes, 0, size as usize);
let ecBytes = generateECBytes(&dataBytes, numEcBytesInBlock[0] as usize);
let ecBytes = generateECBytes(&dataBytes, numEcBytesInBlock as usize);
blocks.push(BlockPair::new(dataBytes, ecBytes.clone()));
maxNumDataBytes = maxNumDataBytes.max(size);
maxNumEcBytes = maxNumEcBytes.max(ecBytes.len());
dataBytesOffset += numDataBytesInBlock[0] as usize;
dataBytesOffset += numDataBytesInBlock as usize;
}
if numDataBytes != dataBytesOffset as u32 {
return Err(Exceptions::WriterException(
@@ -624,12 +621,12 @@ pub fn interleaveWithECBytes(
for block in &blocks {
// for (BlockPair block : blocks) {
let ecBytes = block.getErrorCorrectionBytes();
if (i < ecBytes.len()) {
if i < ecBytes.len() {
result.appendBits(ecBytes[i] as u32, 8)?;
}
}
}
if (numTotalBytes != result.getSizeInBytes() as u32) {
if numTotalBytes != result.getSizeInBytes() as u32 {
// Should be same.
return Err(Exceptions::WriterException(format!(
"Interleaving error: {} and {} differ.",
@@ -654,7 +651,7 @@ pub fn generateECBytes(dataBytes: &[u8], numEcBytesInBlock: usize) -> Vec<u8> {
ReedSolomonEncoder::new(get_predefined_genericgf(
PredefinedGenericGF::QrCodeField256,
))
.encode(&mut toEncode, numEcBytesInBlock);
.encode(&mut toEncode, numEcBytesInBlock).expect("rs encode must complete");
let mut ecBytes = vec![0u8; numEcBytesInBlock];
for i in 0..numEcBytesInBlock {