mirror of
https://github.com/starovoid/rxing.git
synced 2026-07-27 21:02:35 +00:00
genericgf tests added
This commit is contained in:
@@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2018 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.common.reedsolomon;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests {@link GenericGFPoly}.
|
|
||||||
*/
|
|
||||||
public final class GenericGFPolyTestCase extends Assert {
|
|
||||||
|
|
||||||
private static final GenericGF FIELD = GenericGF.QR_CODE_FIELD_256;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testPolynomialString() {
|
|
||||||
assertEquals("0", FIELD.getZero().toString());
|
|
||||||
assertEquals("-1", FIELD.buildMonomial(0, -1).toString());
|
|
||||||
GenericGFPoly p = new GenericGFPoly(FIELD, new int[] {3, 0, -2, 1, 1});
|
|
||||||
assertEquals("a^25x^4 - ax^2 + x + 1", p.toString());
|
|
||||||
p = new GenericGFPoly(FIELD, new int[] {3});
|
|
||||||
assertEquals("a^25", p.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testZero() {
|
|
||||||
assertEquals(FIELD.getZero(),FIELD.buildMonomial(1, 0));
|
|
||||||
assertEquals(FIELD.getZero(), FIELD.buildMonomial(1, 2).multiply(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testEvaluate() {
|
|
||||||
assertEquals(3, FIELD.buildMonomial(0, 3).evaluateAt(0));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
49
src/common/reedsolomon/GenericGFPolyTestCase.rs
Normal file
49
src/common/reedsolomon/GenericGFPolyTestCase.rs
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2018 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.common.reedsolomon;
|
||||||
|
|
||||||
|
//import org.junit.Assert;
|
||||||
|
//import org.junit.Test;
|
||||||
|
|
||||||
|
use super::{GenericGF, GenericGFPoly};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link GenericGFPoly}.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const FIELD :GenericGF= super::QR_CODE_FIELD_256;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testPolynomialString() {
|
||||||
|
assert_eq!("0", FIELD.getZero().to_string());
|
||||||
|
assert_eq!("-1", FIELD.buildMonomial(0, -1).to_string());
|
||||||
|
let p = GenericGFPoly::new(Box::new(FIELD), &vec![3, 0, -2, 1, 1]).unwrap();
|
||||||
|
assert_eq!("a^25x^4 - ax^2 + x + 1", p.to_string());
|
||||||
|
let p = GenericGFPoly::new(Box::new(FIELD), &vec![3]).unwrap();
|
||||||
|
assert_eq!("a^25", p.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testZero() {
|
||||||
|
assert_eq!(*FIELD.getZero(),*FIELD.buildMonomial(1, 0));
|
||||||
|
assert_eq!(*FIELD.getZero(), *FIELD.buildMonomial(1, 2).multiply(0).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testEvaluate() {
|
||||||
|
assert_eq!(3, FIELD.buildMonomial(0, 3).evaluateAt(0));
|
||||||
|
}
|
||||||
@@ -14,25 +14,25 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.google.zxing.common.reedsolomon;
|
//package com.google.zxing.common.reedsolomon;
|
||||||
|
|
||||||
import org.junit.Assert;
|
// import org.junit.Assert;
|
||||||
import org.junit.Test;
|
// import org.junit.Test;
|
||||||
|
|
||||||
import java.util.Arrays;
|
// import java.util.Arrays;
|
||||||
import java.util.BitSet;
|
// import java.util.BitSet;
|
||||||
import java.util.Random;
|
// import java.util.Random;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rustam Abdullaev
|
* @author Rustam Abdullaev
|
||||||
*/
|
*/
|
||||||
public final class ReedSolomonTestCase extends Assert {
|
//public final class ReedSolomonTestCase extends Assert {
|
||||||
|
|
||||||
private static final int DECODER_RANDOM_TEST_ITERATIONS = 3;
|
const DECODER_RANDOM_TEST_ITERATIONS :i32 = 3;
|
||||||
private static final int DECODER_TEST_ITERATIONS = 10;
|
const DECODER_TEST_ITERATIONS :i32= 10;
|
||||||
|
|
||||||
@Test
|
#[test]
|
||||||
public void testDataMatrix() {
|
fn testDataMatrix() {
|
||||||
// real life test cases
|
// real life test cases
|
||||||
testEncodeDecode(GenericGF.DATA_MATRIX_FIELD_256,
|
testEncodeDecode(GenericGF.DATA_MATRIX_FIELD_256,
|
||||||
new int[] { 142, 164, 186 }, new int[] { 114, 25, 5, 88, 102 });
|
new int[] { 142, 164, 186 }, new int[] { 114, 25, 5, 88, 102 });
|
||||||
@@ -55,8 +55,8 @@ public final class ReedSolomonTestCase extends Assert {
|
|||||||
testEncodeDecodeRandom(GenericGF.DATA_MATRIX_FIELD_256, 220, 35);
|
testEncodeDecodeRandom(GenericGF.DATA_MATRIX_FIELD_256, 220, 35);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
#[test]
|
||||||
public void testQRCode() {
|
fn testQRCode() {
|
||||||
// Test case from example given in ISO 18004, Annex I
|
// Test case from example given in ISO 18004, Annex I
|
||||||
testEncodeDecode(GenericGF.QR_CODE_FIELD_256,
|
testEncodeDecode(GenericGF.QR_CODE_FIELD_256,
|
||||||
new int[] {
|
new int[] {
|
||||||
@@ -86,8 +86,8 @@ public final class ReedSolomonTestCase extends Assert {
|
|||||||
testEncodeDecodeRandom(GenericGF.QR_CODE_FIELD_256, 220, 35);
|
testEncodeDecodeRandom(GenericGF.QR_CODE_FIELD_256, 220, 35);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
#[test]
|
||||||
public void testAztec() {
|
fn testAztec() {
|
||||||
// real life test cases
|
// real life test cases
|
||||||
testEncodeDecode(GenericGF.AZTEC_PARAM,
|
testEncodeDecode(GenericGF.AZTEC_PARAM,
|
||||||
new int[] { 0x5, 0x6 }, new int[] { 0x3, 0x2, 0xB, 0xB, 0x7 });
|
new int[] { 0x5, 0x6 }, new int[] { 0x3, 0x2, 0xB, 0xB, 0x7 });
|
||||||
@@ -412,7 +412,7 @@ public final class ReedSolomonTestCase extends Assert {
|
|||||||
testEncodeDecodeRandom(GenericGF.AZTEC_DATA_12, 3072, 1023);
|
testEncodeDecodeRandom(GenericGF.AZTEC_DATA_12, 3072, 1023);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void corrupt(int[] received, int howMany, Random random, int max) {
|
fn corrupt(int[] received, int howMany, Random random, int max) {
|
||||||
BitSet corrupted = new BitSet(received.length);
|
BitSet corrupted = new BitSet(received.length);
|
||||||
for (int j = 0; j < howMany; j++) {
|
for (int j = 0; j < howMany; j++) {
|
||||||
int location = random.nextInt(received.length);
|
int location = random.nextInt(received.length);
|
||||||
@@ -426,7 +426,7 @@ public final class ReedSolomonTestCase extends Assert {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void testEncodeDecodeRandom(GenericGF field, int dataSize, int ecSize) {
|
fn testEncodeDecodeRandom(GenericGF field, int dataSize, int ecSize) {
|
||||||
assertTrue("Invalid data size for " + field, dataSize > 0 && dataSize <= field.getSize() - 3);
|
assertTrue("Invalid data size for " + field, dataSize > 0 && dataSize <= field.getSize() - 3);
|
||||||
assertTrue("Invalid ECC size for " + field, ecSize > 0 && ecSize + dataSize <= field.getSize());
|
assertTrue("Invalid ECC size for " + field, ecSize > 0 && ecSize + dataSize <= field.getSize());
|
||||||
ReedSolomonEncoder encoder = new ReedSolomonEncoder(field);
|
ReedSolomonEncoder encoder = new ReedSolomonEncoder(field);
|
||||||
@@ -449,12 +449,12 @@ public final class ReedSolomonTestCase extends Assert {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void testEncodeDecode(GenericGF field, int[] dataWords, int[] ecWords) {
|
fn testEncodeDecode(GenericGF field, int[] dataWords, int[] ecWords) {
|
||||||
testEncoder(field, dataWords, ecWords);
|
testEncoder(field, dataWords, ecWords);
|
||||||
testDecoder(field, dataWords, ecWords);
|
testDecoder(field, dataWords, ecWords);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void testEncoder(GenericGF field, int[] dataWords, int[] ecWords) {
|
fn testEncoder(GenericGF field, int[] dataWords, int[] ecWords) {
|
||||||
ReedSolomonEncoder encoder = new ReedSolomonEncoder(field);
|
ReedSolomonEncoder encoder = new ReedSolomonEncoder(field);
|
||||||
int[] messageExpected = new int[dataWords.length + ecWords.length];
|
int[] messageExpected = new int[dataWords.length + ecWords.length];
|
||||||
int[] message = new int[dataWords.length + ecWords.length];
|
int[] message = new int[dataWords.length + ecWords.length];
|
||||||
@@ -466,7 +466,7 @@ public final class ReedSolomonTestCase extends Assert {
|
|||||||
messageExpected, message);
|
messageExpected, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void testDecoder(GenericGF field, int[] dataWords, int[] ecWords) {
|
fn testDecoder(GenericGF field, int[] dataWords, int[] ecWords) {
|
||||||
ReedSolomonDecoder decoder = new ReedSolomonDecoder(field);
|
ReedSolomonDecoder decoder = new ReedSolomonDecoder(field);
|
||||||
int[] message = new int[dataWords.length + ecWords.length];
|
int[] message = new int[dataWords.length + ecWords.length];
|
||||||
int maxErrors = ecWords.length / 2;
|
int maxErrors = ecWords.length / 2;
|
||||||
@@ -501,7 +501,7 @@ public final class ReedSolomonTestCase extends Assert {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void assertDataEquals(String message, int[] expected, int[] received) {
|
fn assertDataEquals(String message, int[] expected, int[] received) {
|
||||||
for (int i = 0; i < expected.length; i++) {
|
for (int i = 0; i < expected.length; i++) {
|
||||||
if (expected[i] != received[i]) {
|
if (expected[i] != received[i]) {
|
||||||
fail(message + ". Mismatch at " + i + ". Expected " + arrayToString(expected) + ", got " +
|
fail(message + ". Mismatch at " + i + ". Expected " + arrayToString(expected) + ", got " +
|
||||||
@@ -510,7 +510,7 @@ public final class ReedSolomonTestCase extends Assert {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String arrayToString(int[] data) {
|
fn String arrayToString(int[] data) {
|
||||||
StringBuilder sb = new StringBuilder("{");
|
StringBuilder sb = new StringBuilder("{");
|
||||||
for (int i = 0; i < data.length; i++) {
|
for (int i = 0; i < data.length; i++) {
|
||||||
sb.append(String.format(i > 0 ? ",%X" : "%X", data[i]));
|
sb.append(String.format(i > 0 ? ",%X" : "%X", data[i]));
|
||||||
@@ -518,8 +518,8 @@ public final class ReedSolomonTestCase extends Assert {
|
|||||||
return sb.append('}').toString();
|
return sb.append('}').toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Random getPseudoRandom() {
|
fn Random getPseudoRandom() {
|
||||||
return new Random(0xDEADBEEF);
|
return new Random(0xDEADBEEF);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
//}
|
||||||
@@ -3,6 +3,9 @@ use std::fmt;
|
|||||||
use crate::exceptions::*;
|
use crate::exceptions::*;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod GenericGFPolyTestCase;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyrigh&t 2007 ZXing authors
|
* Copyrigh&t 2007 ZXing authors
|
||||||
*
|
*
|
||||||
@@ -77,7 +80,8 @@ pub const MAXICODE_FIELD_64: GenericGF = AZTEC_DATA_6;
|
|||||||
* @author Sean Owen
|
* @author Sean Owen
|
||||||
* @author David Olivier
|
* @author David Olivier
|
||||||
*/
|
*/
|
||||||
pub struct GenericGF {
|
#[derive(Debug)]
|
||||||
|
pub struct GenericGF {
|
||||||
expTable: Vec<usize>,
|
expTable: Vec<usize>,
|
||||||
logTable: Vec<usize>,
|
logTable: Vec<usize>,
|
||||||
zero: Box<GenericGFPoly>,
|
zero: Box<GenericGFPoly>,
|
||||||
@@ -251,11 +255,19 @@ impl fmt::Display for GenericGF {
|
|||||||
*
|
*
|
||||||
* @author Sean Owen
|
* @author Sean Owen
|
||||||
*/
|
*/
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct GenericGFPoly {
|
pub struct GenericGFPoly {
|
||||||
field: Box<GenericGF>,
|
field: Box<GenericGF>,
|
||||||
coefficients: Vec<usize>,
|
coefficients: Vec<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq for GenericGFPoly {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.to_string() == other.to_string()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Eq for GenericGFPoly {}
|
||||||
|
|
||||||
impl GenericGFPoly {
|
impl GenericGFPoly {
|
||||||
/**
|
/**
|
||||||
* @param field the {@link GenericGF} instance representing the field to use
|
* @param field the {@link GenericGF} instance representing the field to use
|
||||||
|
|||||||
Reference in New Issue
Block a user