From 6935b9045d51dd4e1a17f042289183ca4f64c311 Mon Sep 17 00:00:00 2001 From: Henry Schimke Date: Tue, 1 Nov 2022 16:16:47 -0500 Subject: [PATCH] some tests with minimal pass --- src/common/minimal_eci_input.rs | 25 ++++++------ .../encoder/high_level_encode_test_case.rs | 4 +- src/datamatrix/encoder/minimal_encoder.rs | 40 ++++++++++--------- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/common/minimal_eci_input.rs b/src/common/minimal_eci_input.rs index e88c576..175174b 100644 --- a/src/common/minimal_eci_input.rs +++ b/src/common/minimal_eci_input.rs @@ -224,7 +224,7 @@ impl MinimalECIInput { Self::encodeMinimally( stringToEncodeInput, &encoderSet, - fnc1.as_ref().unwrap().chars().nth(0).unwrap() as u16, + fnc1 ) }; @@ -279,24 +279,25 @@ impl MinimalECIInput { edges: &mut Vec>>>, from: usize, previous: Option>, - fnc1: u16, + fnc1: Option<&str>, ) { // let ch = stringToEncode.chars().nth(from).unwrap() as i16; let ch = stringToEncode.graphemes(true).nth(from).unwrap(); let mut start = 0; let mut end = encoderSet.len(); + if let Some(fnc1) = fnc1 { if encoderSet.getPriorityEncoderIndex().is_some() - && (ch.chars().nth(0).unwrap() as u16 == fnc1 + && (ch.chars().nth(0).unwrap() == fnc1.chars().nth(1).unwrap() || encoderSet.canEncode(ch, encoderSet.getPriorityEncoderIndex().unwrap())) { start = encoderSet.getPriorityEncoderIndex().unwrap(); end = start + 1; - } + }} for i in start..end { // for (int i = start; i < end; i++) { - if ch.chars().nth(0).unwrap() as u16 == fnc1 || encoderSet.canEncode(ch, i) { + if (fnc1.is_some() && ch.chars().nth(0).unwrap() == fnc1.as_ref().unwrap().chars().nth(0).unwrap()) || encoderSet.canEncode(ch, i) { Self::addEdge( edges, from + 1, @@ -309,15 +310,15 @@ impl MinimalECIInput { pub fn encodeMinimally( stringToEncode: &str, encoderSet: &ECIEncoderSet, - fnc1: u16, + fnc1: Option<&str>, ) -> Vec { - let inputLength = stringToEncode.len(); + let inputLength = stringToEncode.chars().count(); // Array that represents vertices. There is a vertex for every character and encoding. let mut edges = vec![vec![None; encoderSet.len()]; inputLength + 1]; //InputEdge[inputLength + 1][encoderSet.length()]; Self::addEdges(stringToEncode, encoderSet, &mut edges, 0, None, fnc1); - for i in 0..=inputLength { + for i in 1..=inputLength { // for (int i = 1; i <= inputLength; i++) { for j in 0..encoderSet.len() { // for (int j = 0; j < encoderSet.length(); j++) { @@ -400,7 +401,7 @@ impl InputEdge { encoderSet: &ECIEncoderSet, encoderIndex: usize, previous: Option>, - fnc1: u16, + fnc1: Option<&str>, ) -> Self { let mut size = if c == "\u{1000}" { 1 @@ -408,7 +409,7 @@ impl InputEdge { encoderSet.encode_char(c, encoderIndex).len() }; - let fnc1Str = String::from_utf16(&[fnc1]).unwrap(); + //let fnc1Str = String::from_utf16(&[fnc1]).unwrap(); if let Some(prev) = previous { let previousEncoderIndex = prev.encoderIndex; @@ -418,7 +419,7 @@ impl InputEdge { size += prev.cachedTotalSize; Self { - c: if c == fnc1Str { + c: if fnc1.is_some() && &c == fnc1.as_ref().unwrap() { String::from("\u{1000}") } else { String::from(c) @@ -434,7 +435,7 @@ impl InputEdge { } Self { - c: if c == fnc1Str { + c: if fnc1.is_some() && &c == fnc1.as_ref().unwrap() { String::from("\u{1000}") } else { String::from(c) diff --git a/src/datamatrix/encoder/high_level_encode_test_case.rs b/src/datamatrix/encoder/high_level_encode_test_case.rs index ef04aec..a3af23d 100644 --- a/src/datamatrix/encoder/high_level_encode_test_case.rs +++ b/src/datamatrix/encoder/high_level_encode_test_case.rs @@ -556,8 +556,8 @@ fn encodeHighLevel(msg: &str) -> String { fn encodeHighLevelCompare(msg: &str, compareSizeToMinimalEncoder: bool) -> String { let encoded = high_level_encoder::encodeHighLevel(msg).expect("encodes"); - // let encoded2 = minimal_encoder::encodeHighLevel(msg).expect("encodes"); - // assert!(!compareSizeToMinimalEncoder || encoded2.len() <= encoded.len(), "{} <= {}", encoded2.len() , encoded.len()); + let encoded2 = minimal_encoder::encodeHighLevel(msg).expect("encodes"); + assert!(!compareSizeToMinimalEncoder || encoded2.len() <= encoded.len(), "{} <= {}", encoded2.len() , encoded.len()); visualize(&encoded) } diff --git a/src/datamatrix/encoder/minimal_encoder.rs b/src/datamatrix/encoder/minimal_encoder.rs index 33d0fa5..99681cc 100755 --- a/src/datamatrix/encoder/minimal_encoder.rs +++ b/src/datamatrix/encoder/minimal_encoder.rs @@ -164,13 +164,13 @@ pub fn encodeHighLevelWithDetails( { macroId = 5; // msg = msg.substring(high_level_encoder::MACRO_05_HEADER.len(), msg.len() - 2); - msg = &msg[high_level_encoder::MACRO_05_HEADER.len()..(msg.len() - 2)]; + msg = &msg[high_level_encoder::MACRO_05_HEADER.chars().count()..(msg.chars().count() - 2)]; } else if msg.starts_with(high_level_encoder::MACRO_06_HEADER) && msg.ends_with(high_level_encoder::MACRO_TRAILER) { macroId = 6; // msg = msg.substring(high_level_encoder::MACRO_06_HEADER.len(), msg.len() - 2); - msg = &msg[high_level_encoder::MACRO_06_HEADER.len()..(msg.len() - 2)]; + msg = &msg[high_level_encoder::MACRO_06_HEADER.chars().count()..(msg.chars().count() - 2)]; } Ok(ISO_8859_1_ENCODER .decode( @@ -253,7 +253,7 @@ fn getNumberOfC40Words( || !c40 && high_level_encoder::isNativeText(ci) { thirdsCount += 1; //native - } else if !isExtendedASCII(ci, Some(input.getFNC1Character())) { + } else if !isExtendedASCII(ci, input.getFNC1Character()) { thirdsCount += 2; //shift } else { let asciiValue = ci as u8 & 0xff; @@ -711,7 +711,7 @@ impl Edge { input .charAt(fromPosition as usize) .expect("char must exist)"), - Some(input.getFNC1Character()), + input.getFNC1Character(), ) { size += 1; @@ -878,7 +878,7 @@ impl Edge { if length - from == 1 { if isExtendedASCII( self.input.charAt(from as usize)?, - Some(self.input.getFNC1Character()), + self.input.getFNC1Character(), ) { return Ok(0); } @@ -887,10 +887,10 @@ impl Edge { if length - from == 2 { if isExtendedASCII( self.input.charAt(from as usize)?, - Some(self.input.getFNC1Character()), + self.input.getFNC1Character(), ) || isExtendedASCII( self.input.charAt(from as usize + 1)?, - Some(self.input.getFNC1Character()), + self.input.getFNC1Character(), ) { return Ok(0); } @@ -906,7 +906,7 @@ impl Edge { && high_level_encoder::isDigit(self.input.charAt(from as usize + 1)?) && !isExtendedASCII( self.input.charAt(from as usize + 2)?, - Some(self.input.getFNC1Character()), + self.input.getFNC1Character(), ) { return Ok(2); @@ -915,7 +915,7 @@ impl Edge { && high_level_encoder::isDigit(self.input.charAt(from as usize + 2)?) && !isExtendedASCII( self.input.charAt(from as usize)?, - Some(self.input.getFNC1Character()), + self.input.getFNC1Character(), ) { return Ok(2); @@ -1246,7 +1246,7 @@ impl Edge { )); } else if isExtendedASCII( self.input.charAt(self.fromPosition as usize)?, - Some(self.input.getFNC1Character()), + self.input.getFNC1Character(), ) { return Ok(Self::getBytes2( 235, @@ -1272,8 +1272,8 @@ impl Edge { self.input.charAt(self.fromPosition as usize)? as u32, )) } - Mode::C40 => return self.getC40Words(true, Some(self.input.getFNC1Character())), - Mode::TEXT => return self.getC40Words(false, Some(self.input.getFNC1Character())), + Mode::C40 => return self.getC40Words(true, self.input.getFNC1Character()), + Mode::TEXT => return self.getC40Words(false, self.input.getFNC1Character()), Mode::X12 => return self.getX12Words(), Mode::EDF => return self.getEDFBytes(), } @@ -1321,7 +1321,8 @@ impl RXingResult { randomizePostfixLength.push(bytesAL.len()); randomizeLengths.push(size); } - Self::prepend(¤t.getLatchBytes()?, &mut bytesAL); + if Edge::getPreviousStartMode(current.previous.clone()) != current.getMode() { + Self::prepend(¤t.getLatchBytes()?, &mut bytesAL);} size = 0; } @@ -1333,7 +1334,7 @@ impl RXingResult { size += Self::prepend(&Edge::getBytes1(237), &mut bytesAL); } - if input.getFNC1Character() as u8 > 0 { + if input.getFNC1Character().is_some() { size += Self::prepend(&Edge::getBytes1(232), &mut bytesAL); } for i in 0..randomizePostfixLength.len() { @@ -1427,9 +1428,6 @@ impl Input { macroId, internal: MinimalECIInput::new(stringToEncode, priorityCharset, v), } - // super(stringToEncode, priorityCharset, fnc1); - // this.shape = shape; - // this.macroId = macroId; } pub fn getMacroId(&self) -> i32 { @@ -1449,8 +1447,12 @@ impl Input { pub fn charAt(&self, index: usize) -> Result { self.internal.charAt(index) } - pub fn getFNC1Character(&self) -> char { - self.internal.getFNC1Character() as u8 as char + pub fn getFNC1Character(&self) -> Option { + if self.internal.getFNC1Character() == 1000 { + None + }else { + Some(self.internal.getFNC1Character() as u8 as char) + } } fn haveNCharacters(&self, index: usize, n: usize) -> bool { self.internal.haveNCharacters(index, n)