diff --git a/src/multi/generic_multiple_barcode_reader.rs b/src/multi/generic_multiple_barcode_reader.rs index 8e912cc..e6c2178 100644 --- a/src/multi/generic_multiple_barcode_reader.rs +++ b/src/multi/generic_multiple_barcode_reader.rs @@ -53,7 +53,7 @@ impl MultipleBarcodeReader for GenericMultipleBarcodeReader { hints: &crate::DecodingHintDictionary, ) -> Result, crate::Exceptions> { let mut results = Vec::new(); - self.doDecodeMultiple(image, hints, &mut results, 0, 0, 0)?; + self.doDecodeMultiple(image, hints, &mut results, 0, 0, 0); if results.is_empty() { return Err(Exceptions::NotFoundException("".to_owned())); } @@ -76,28 +76,19 @@ impl GenericMultipleBarcodeReader { xOffset: u32, yOffset: u32, currentDepth: u32, - ) -> Result<(), Exceptions> { + ) { if currentDepth > Self::MAX_DEPTH { - return Ok(()); + return; } - let result; - //try { - result = self.0.decode_with_hints(image, hints); - //} catch (ReaderException ignored) { - // return; - //} - if let Err(Exceptions::ReaderException(_)) = result { - return Ok(()); - } else if result.is_err() { - return Err(result.err().unwrap()); - } - - let result = result.expect("must exist"); + // let result; + let Ok(result) = self.0.decode_with_hints(image, hints) else { + return; + }; let mut alreadyFound = false; for existingRXingResult in results.iter() { - if existingRXingResult.getText() == (result.getText()) { + if existingRXingResult.getText() == result.getText() { alreadyFound = true; break; } @@ -110,8 +101,9 @@ impl GenericMultipleBarcodeReader { } if resultPoints.is_empty() { - return Ok(()); + return; } + let width = image.getWidth(); let height = image.getHeight(); let mut minX: f32 = width as f32; @@ -147,7 +139,7 @@ impl GenericMultipleBarcodeReader { xOffset, yOffset, currentDepth + 1, - )?; + ); } // Decode above barcode if minY > Self::MIN_DIMENSION_TO_RECUR { @@ -158,7 +150,7 @@ impl GenericMultipleBarcodeReader { xOffset, yOffset, currentDepth + 1, - )?; + ); } // Decode right of barcode if maxX < (width as f32) - Self::MIN_DIMENSION_TO_RECUR { @@ -169,7 +161,7 @@ impl GenericMultipleBarcodeReader { xOffset + maxX as u32, yOffset, currentDepth + 1, - )?; + ); } // Decode below barcode if maxY < (height as f32) - Self::MIN_DIMENSION_TO_RECUR { @@ -180,9 +172,8 @@ impl GenericMultipleBarcodeReader { xOffset, yOffset + maxY as u32, currentDepth + 1, - )?; + ); } - Ok(()) } fn translateRXingResultPoints(result: RXingResult, xOffset: u32, yOffset: u32) -> RXingResult { diff --git a/src/multi/multi_test_case.rs b/src/multi/multi_test_case.rs index 738934c..8f034ad 100644 --- a/src/multi/multi_test_case.rs +++ b/src/multi/multi_test_case.rs @@ -14,11 +14,11 @@ * limitations under the License. */ -use std::{path::PathBuf, rc::Rc}; +use std::{collections::HashSet, path::PathBuf, rc::Rc}; use crate::{ - common::HybridBinarizer, BarcodeFormat, BinaryBitmap, BufferedImageLuminanceSource, - MultiFormatReader, + common::HybridBinarizer, qrcode::QRCodeReader, BarcodeFormat, BinaryBitmap, + BufferedImageLuminanceSource, MultiFormatReader, }; use super::{GenericMultipleBarcodeReader, MultipleBarcodeReader}; @@ -51,3 +51,41 @@ fn testMulti() { assert_eq!("www.airtable.com/jobs", results[1].getText()); assert_eq!(&BarcodeFormat::QR_CODE, results[1].getBarcodeFormat()); } + +#[test] +fn testMultiQR() { + // Very basic test for now + let mut testBase = PathBuf::from("test_resources/blackbox/multi-qrcode-1"); + + testBase.push("1.png"); + let image = image::io::Reader::open(testBase) + .expect("image must open") + .decode() + .expect("must decode"); + let source = BufferedImageLuminanceSource::new(image); + let bitmap = BinaryBitmap::new(Rc::new(HybridBinarizer::new(Box::new(source)))); + + let mut reader = GenericMultipleBarcodeReader::new(MultiFormatReader::default()); + let results = reader.decodeMultiple(&bitmap).expect("must decode multi"); + assert_eq!(4, results.len()); + + let mut barcodeContents = HashSet::new(); + for result in results { + barcodeContents.insert(result.getText().to_owned()); + assert_eq!(&BarcodeFormat::QR_CODE, result.getBarcodeFormat()); + assert!(!result.getRXingResultMetadata().is_empty()); + } + let mut expectedContents = HashSet::new(); + expectedContents.insert( + "You earned the class a 5 MINUTE DANCE PARTY!! Awesome! Way to go! Let's boogie!" + .to_owned(), + ); + expectedContents.insert( + "You earned the class 5 EXTRA MINUTES OF RECESS!! Fabulous!! Way to go!!".to_owned(), + ); + expectedContents.insert( + "You get to SIT AT MRS. SIGMON'S DESK FOR A DAY!! Awesome!! Way to go!! Guess I better clean up! :)".to_owned()); + expectedContents + .insert("You get to CREATE OUR JOURNAL PROMPT FOR THE DAY! Yay! Way to go! ".to_owned()); + assert_eq!(expectedContents, barcodeContents); +}