From 7aea86141796ea8b32952ce2393e75f2e8be8baf Mon Sep 17 00:00:00 2001 From: Henry Schimke Date: Thu, 1 Dec 2022 11:50:26 -0600 Subject: [PATCH] qrcode multi reader test pass --- src/multi/qrcode/MultiQRCodeTestCase.java | 105 ----------------- src/multi/qrcode/qr_code_multi_reader.rs | 133 ++++++++++++++++++++++ 2 files changed, 133 insertions(+), 105 deletions(-) delete mode 100644 src/multi/qrcode/MultiQRCodeTestCase.java diff --git a/src/multi/qrcode/MultiQRCodeTestCase.java b/src/multi/qrcode/MultiQRCodeTestCase.java deleted file mode 100644 index eb8b902..0000000 --- a/src/multi/qrcode/MultiQRCodeTestCase.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2016 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. - */ - -package com.google.zxing.multi.qrcode; - -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; - -import com.google.zxing.BarcodeFormat; -import com.google.zxing.BinaryBitmap; -import com.google.zxing.BufferedImageLuminanceSource; -import com.google.zxing.LuminanceSource; -import com.google.zxing.RXingResult; -import com.google.zxing.RXingResultMetadataType; -import com.google.zxing.RXingResultPoint; -import com.google.zxing.common.AbstractBlackBoxTestCase; -import com.google.zxing.common.HybridBinarizer; -import com.google.zxing.multi.MultipleBarcodeReader; -import org.junit.Assert; -import org.junit.Test; - -/** - * Tests {@link QRCodeMultiReader}. - */ -public final class MultiQRCodeTestCase extends Assert { - - @Test - public void testMultiQRCodes() throws Exception { - // Very basic test for now - Path testBase = AbstractBlackBoxTestCase.buildTestBase("src/test/resources/blackbox/multi-qrcode-1"); - - Path testImage = testBase.resolve("1.png"); - BufferedImage image = ImageIO.read(testImage.toFile()); - LuminanceSource source = new BufferedImageLuminanceSource(image); - BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); - - MultipleBarcodeReader reader = new QRCodeMultiReader(); - RXingResult[] results = reader.decodeMultiple(bitmap); - assertNotNull(results); - assertEquals(4, results.length); - - Collection barcodeContents = new HashSet<>(); - for (RXingResult result : results) { - barcodeContents.add(result.getText()); - assertEquals(BarcodeFormat.QR_CODE, result.getBarcodeFormat()); - assertNotNull(result.getRXingResultMetadata()); - } - Collection expectedContents = new HashSet<>(); - expectedContents.add("You earned the class a 5 MINUTE DANCE PARTY!! Awesome! Way to go! Let's boogie!"); - expectedContents.add("You earned the class 5 EXTRA MINUTES OF RECESS!! Fabulous!! Way to go!!"); - expectedContents.add( - "You get to SIT AT MRS. SIGMON'S DESK FOR A DAY!! Awesome!! Way to go!! Guess I better clean up! :)"); - expectedContents.add("You get to CREATE OUR JOURNAL PROMPT FOR THE DAY! Yay! Way to go! "); - assertEquals(expectedContents, barcodeContents); - } - - @Test - public void testProcessStructuredAppend() { - RXingResult sa1 = new RXingResult("SA1", new byte[]{}, new RXingResultPoint[]{}, BarcodeFormat.QR_CODE); - RXingResult sa2 = new RXingResult("SA2", new byte[]{}, new RXingResultPoint[]{}, BarcodeFormat.QR_CODE); - RXingResult sa3 = new RXingResult("SA3", new byte[]{}, new RXingResultPoint[]{}, BarcodeFormat.QR_CODE); - sa1.putMetadata(RXingResultMetadataType.STRUCTURED_APPEND_SEQUENCE, 2); - sa1.putMetadata(RXingResultMetadataType.ERROR_CORRECTION_LEVEL, "L"); - sa2.putMetadata(RXingResultMetadataType.STRUCTURED_APPEND_SEQUENCE, (1 << 4) + 2); - sa2.putMetadata(RXingResultMetadataType.ERROR_CORRECTION_LEVEL, "L"); - sa3.putMetadata(RXingResultMetadataType.STRUCTURED_APPEND_SEQUENCE, (2 << 4) + 2); - sa3.putMetadata(RXingResultMetadataType.ERROR_CORRECTION_LEVEL, "L"); - - RXingResult nsa = new RXingResult("NotSA", new byte[]{}, new RXingResultPoint[]{}, BarcodeFormat.QR_CODE); - nsa.putMetadata(RXingResultMetadataType.ERROR_CORRECTION_LEVEL, "L"); - - List inputs = Arrays.asList(sa3, sa1, nsa, sa2); - - List results = QRCodeMultiReader.processStructuredAppend(inputs); - assertNotNull(results); - assertEquals(2, results.size()); - - Collection barcodeContents = new HashSet<>(); - for (RXingResult result : results) { - barcodeContents.add(result.getText()); - } - Collection expectedContents = new HashSet<>(); - expectedContents.add("SA1SA2SA3"); - expectedContents.add("NotSA"); - assertEquals(expectedContents, barcodeContents); - } -} diff --git a/src/multi/qrcode/qr_code_multi_reader.rs b/src/multi/qrcode/qr_code_multi_reader.rs index 9230baf..1684d6c 100644 --- a/src/multi/qrcode/qr_code_multi_reader.rs +++ b/src/multi/qrcode/qr_code_multi_reader.rs @@ -125,6 +125,10 @@ impl MultipleBarcodeReader for QRCodeMultiReader { } impl QRCodeMultiReader { + pub fn new() -> Self { + Self(QRCodeReader::new()) + } + fn processStructuredAppend(results: Vec) -> Result, Exceptions> { let mut newRXingResults = Vec::new(); let mut saRXingResults = Vec::new(); @@ -198,3 +202,132 @@ fn compareRXingResult(a: &RXingResult, b: &RXingResult) -> Ordering { aNumber.cmp(bNumber) } + +#[cfg(test)] +mod multi_qr_code_test_case { + /* + * Copyright 2016 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 std::{collections::HashSet, path::PathBuf, rc::Rc}; + + use image; + + use crate::{ + common::HybridBinarizer, multi::MultipleBarcodeReader, BarcodeFormat, BinaryBitmap, + BufferedImageLuminanceSource, RXingResult, RXingResultMetadataType, + RXingResultMetadataValue, + }; + + use super::QRCodeMultiReader; + + /** + * Tests {@link QRCodeMultiReader}. + */ + + #[test] + fn testMultiQRCodes() { + // 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 reader = QRCodeMultiReader::new(); + let results = reader.decodeMultiple(&bitmap).expect("must decode"); + // assertNotNull(results); + 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); + } + + #[test] + fn testProcessStructuredAppend() { + let mut sa1 = RXingResult::new("SA1", Vec::new(), Vec::new(), BarcodeFormat::QR_CODE); + let mut sa2 = RXingResult::new("SA2", Vec::new(), Vec::new(), BarcodeFormat::QR_CODE); + let mut sa3 = RXingResult::new("SA3", Vec::new(), Vec::new(), BarcodeFormat::QR_CODE); + sa1.putMetadata( + RXingResultMetadataType::STRUCTURED_APPEND_SEQUENCE, + RXingResultMetadataValue::StructuredAppendSequence(2), + ); + sa1.putMetadata( + RXingResultMetadataType::ERROR_CORRECTION_LEVEL, + RXingResultMetadataValue::ErrorCorrectionLevel("L".to_owned()), + ); + sa2.putMetadata( + RXingResultMetadataType::STRUCTURED_APPEND_SEQUENCE, + RXingResultMetadataValue::StructuredAppendSequence((1 << 4) + 2), + ); + sa2.putMetadata( + RXingResultMetadataType::ERROR_CORRECTION_LEVEL, + RXingResultMetadataValue::ErrorCorrectionLevel("L".to_owned()), + ); + sa3.putMetadata( + RXingResultMetadataType::STRUCTURED_APPEND_SEQUENCE, + RXingResultMetadataValue::StructuredAppendSequence((2 << 4) + 2), + ); + sa3.putMetadata( + RXingResultMetadataType::ERROR_CORRECTION_LEVEL, + RXingResultMetadataValue::ErrorCorrectionLevel("L".to_owned()), + ); + + let mut nsa = RXingResult::new("NotSA", Vec::new(), Vec::new(), BarcodeFormat::QR_CODE); + nsa.putMetadata( + RXingResultMetadataType::ERROR_CORRECTION_LEVEL, + RXingResultMetadataValue::ErrorCorrectionLevel("L".to_owned()), + ); + + let inputs = vec![sa3, sa1, nsa, sa2]; + + let results = + QRCodeMultiReader::processStructuredAppend(inputs).expect("result must return"); + // assertNotNull(results); + assert_eq!(2, results.len()); + + let mut barcodeContents = HashSet::new(); + for result in results { + barcodeContents.insert(result.getText().to_owned()); + } + let mut expectedContents = HashSet::new(); + expectedContents.insert("SA1SA2SA3".to_owned()); + expectedContents.insert("NotSA".to_owned()); + assert_eq!(expectedContents, barcodeContents); + } +}