orw changes post tab to space chagnes

This commit is contained in:
Anjali Sridhar 2024-10-12 18:28:31 -07:00
parent 9598db91c7
commit 54e16e2188
31 changed files with 836 additions and 716 deletions

View file

@ -16,7 +16,7 @@ jobs:
- name: Set up JDK 8 - name: Set up JDK 8
uses: actions/setup-java@v4 uses: actions/setup-java@v4
with: with:
java-version: '8' java-version: '17'
distribution: 'temurin' distribution: 'temurin'
cache: 'maven' cache: 'maven'
- name: Build with Maven - name: Build with Maven

View file

@ -20,6 +20,9 @@
<artifactId>core</artifactId> <artifactId>core</artifactId>
<version>3.5.4-SNAPSHOT</version> <version>3.5.4-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties>
<java.version>17</java.version>
</properties>
<dependencies> <dependencies>
<dependency> <dependency>

View file

@ -42,8 +42,7 @@ public final class Dimension {
@Override @Override
public boolean equals(Object other) { public boolean equals(Object other) {
if (other instanceof Dimension) { if (other instanceof Dimension d) {
Dimension d = (Dimension) other;
return width == d.width && height == d.height; return width == d.width && height == d.height;
} }
return false; return false;

View file

@ -44,8 +44,7 @@ public class ResultPoint {
@Override @Override
public final boolean equals(Object other) { public final boolean equals(Object other) {
if (other instanceof ResultPoint) { if (other instanceof ResultPoint otherPoint) {
ResultPoint otherPoint = (ResultPoint) other;
return x == otherPoint.x && y == otherPoint.y; return x == otherPoint.x && y == otherPoint.y;
} }
return false; return false;

View file

@ -85,7 +85,7 @@ public final class Decoder {
byte[] rawBytes = convertBoolArrayToByteArray(correctedBits.correctBits); byte[] rawBytes = convertBoolArrayToByteArray(correctedBits.correctBits);
String result = getEncodedData(correctedBits.correctBits); String result = getEncodedData(correctedBits.correctBits);
DecoderResult decoderResult = DecoderResult decoderResult =
new DecoderResult(rawBytes, result, null, String.format("%d%%", correctedBits.ecLevel)); new DecoderResult(rawBytes, result, null, "%d%%".formatted(correctedBits.ecLevel));
decoderResult.setNumBits(correctedBits.correctBits.length); decoderResult.setNumBits(correctedBits.correctBits.length);
decoderResult.setErrorsCorrected(correctedBits.errorsCorrected); decoderResult.setErrorsCorrected(correctedBits.errorsCorrected);
return decoderResult; return decoderResult;

View file

@ -135,7 +135,7 @@ public final class Encoder {
layers = Math.abs(userSpecifiedLayers); layers = Math.abs(userSpecifiedLayers);
if (layers > (compact ? MAX_NB_BITS_COMPACT : MAX_NB_BITS)) { if (layers > (compact ? MAX_NB_BITS_COMPACT : MAX_NB_BITS)) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
String.format("Illegal value %s for layers", userSpecifiedLayers)); "Illegal value %s for layers".formatted(userSpecifiedLayers));
} }
totalBitsInLayer = totalBitsInLayer(layers, compact); totalBitsInLayer = totalBitsInLayer(layers, compact);
wordSize = WORD_SIZE[layers]; wordSize = WORD_SIZE[layers];

View file

@ -176,7 +176,7 @@ final class State {
@Override @Override
public String toString() { public String toString() {
return String.format("%s bits=%d bytes=%d", HighLevelEncoder.MODE_NAMES[mode], bitCount, binaryShiftByteCount); return "%s bits=%d bytes=%d".formatted(HighLevelEncoder.MODE_NAMES[mode], bitCount, binaryShiftByteCount);
} }
private static int calculateBinaryShiftCost(int binaryShiftByteCount) { private static int calculateBinaryShiftCost(int binaryShiftByteCount) {

View file

@ -367,10 +367,12 @@ public final class Code128Writer extends OneDimensionalCodeWriter {
private enum Charset { A, B, C, NONE } private enum Charset { A, B, C, NONE }
private enum Latch { A, B, C, SHIFT, NONE } private enum Latch { A, B, C, SHIFT, NONE }
static final String A = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\u0000\u0001\u0002" + static final String A = """
"\u0003\u0004\u0005\u0006\u0007\u0008\u0009\n\u000B\u000C\r\u000E\u000F\u0010\u0011" + !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\
"\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F" + 
"\u00FF"; \
\
ÿ""";
static final String B = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr" + static final String B = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqr" +
"stuvwxyz{|}~\u007F\u00FF"; "stuvwxyz{|}~\u007F\u00FF";

View file

@ -183,7 +183,7 @@ final class DecodedBitStreamParser {
codeIndex < codewords.length && codeIndex < codewords.length &&
codewords[codeIndex] != MACRO_PDF417_TERMINATOR && codewords[codeIndex] != MACRO_PDF417_TERMINATOR &&
codewords[codeIndex] != BEGIN_MACRO_PDF417_OPTIONAL_FIELD) { codewords[codeIndex] != BEGIN_MACRO_PDF417_OPTIONAL_FIELD) {
fileId.append(String.format("%03d", codewords[codeIndex])); fileId.append("%03d".formatted(codewords[codeIndex]));
codeIndex++; codeIndex++;
} }
if (fileId.length() == 0) { if (fileId.length() == 0) {

View file

@ -66,29 +66,31 @@ public final class DecoderTest extends Assert {
@Test @Test
public void testAztecResult() throws FormatException { public void testAztecResult() throws FormatException {
BitMatrix matrix = BitMatrix.parse( BitMatrix matrix = BitMatrix.parse(
"X X X X X X X X X X X X X X \n" + """
"X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X\s
" X X X X X X X X X X \n" + X X X X X X X X X X X X\s
" X X X X X X X X \n" + X X X X X X X X X X\s
" X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X\s
" X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X \s
" X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X X X X X \n" + X X X X X X X X X\s
" X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X \n" + X X X X X X X X X X X X \s
" X X X X X X X X X X X X \n" + X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X \s
"X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X X X \n" + X X X X X X X X X X X\s
" X X X X X X X X \n" + X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X \s
"X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X \s
"X X X X X X X X X X X X X X X \n" + X X X X X X X X X\s
"X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X\s
" X X X X X X X X X X X X X \n", X X X X X X X X X X X X X X \s
X X X X X X X X X X X X X \s
""",
"X ", " "); "X ", " ");
AztecDetectorResult r = new AztecDetectorResult(matrix, NO_POINTS, false, 30, 2); AztecDetectorResult r = new AztecDetectorResult(matrix, NO_POINTS, false, 30, 2);
DecoderResult result = new Decoder().decode(r); DecoderResult result = new Decoder().decode(r);
@ -104,25 +106,27 @@ public final class DecoderTest extends Assert {
@Test @Test
public void testAztecResultECI() throws FormatException { public void testAztecResultECI() throws FormatException {
BitMatrix matrix = BitMatrix.parse( BitMatrix matrix = BitMatrix.parse(
" X X X X X X \n" + """
" X X X X X X X X X X X X \n" + X X X X X X \s
" X X X X \n" + X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X \n" + X X X X\s
" X X \n" + X X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X \n" + X X \s
" X X X X X X X X \n" + X X X X X X X X X X X X \s
" X X X X X X X X X X X X \n" + X X X X X X X X \s
" X X X X X X X X \n" + X X X X X X X X X X X X \s
" X X X X X X X X X \n" + X X X X X X X X \s
"X X X X X X X X X \n" + X X X X X X X X X \s
" X X X X X X X X X X X X \n" + X X X X X X X X X\s
" X X X X X X \n" + X X X X X X X X X X X X \s
" X X X X X X X X X X X X X \n" + X X X X X X\s
" X X X \n" + X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X \n" + X X X \s
"X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X \n" + X X X X X X X X X\s
"X X X X X X X X \n", X X X X X X X X X X X \s
X X X X X X X X \s
""",
"X ", " "); "X ", " ");
AztecDetectorResult r = new AztecDetectorResult(matrix, NO_POINTS, false, 15, 1); AztecDetectorResult r = new AztecDetectorResult(matrix, NO_POINTS, false, 15, 1);
DecoderResult result = new Decoder().decode(r); DecoderResult result = new Decoder().decode(r);
@ -131,34 +135,35 @@ public final class DecoderTest extends Assert {
@Test(expected = FormatException.class) @Test(expected = FormatException.class)
public void testDecodeTooManyErrors() throws FormatException { public void testDecodeTooManyErrors() throws FormatException {
BitMatrix matrix = BitMatrix.parse("" BitMatrix matrix = BitMatrix.parse("""
+ "X X . X . . . X X . . . X . . X X X . X . X X X X X . \n" X X . X . . . X X . . . X . . X X X . X . X X X X X .\s
+ "X X . . X X . . . . . X X . . . X X . . . X . X . . X \n" X X . . X X . . . . . X X . . . X X . . . X . X . . X\s
+ "X . . . X X . . X X X . X X . X X X X . X X . . X . . \n" X . . . X X . . X X X . X X . X X X X . X X . . X . .\s
+ ". . . . X . X X . . X X . X X . X . X X X X . X . . X \n" . . . . X . X X . . X X . X X . X . X X X X . X . . X\s
+ "X X X . . X X X X X . . . . . X X . . . X . X . X . X \n" X X X . . X X X X X . . . . . X X . . . X . X . X . X\s
+ "X X . . . . . . . . X . . . X . X X X . X . . X . . . \n" X X . . . . . . . . X . . . X . X X X . X . . X . . .\s
+ "X X . . X . . . . . X X . . . . . X . . . . X . . X X \n" X X . . X . . . . . X X . . . . . X . . . . X . . X X\s
+ ". . . X . X . X . . . . . X X X X X X . . . . . . X X \n" . . . X . X . X . . . . . X X X X X X . . . . . . X X\s
+ "X . . . X . X X X X X X . . X X X . X . X X X X X X . \n" X . . . X . X X X X X X . . X X X . X . X X X X X X .\s
+ "X . . X X X . X X X X X X X X X X X X X . . . X . X X \n" X . . X X X . X X X X X X X X X X X X X . . . X . X X\s
+ ". . . . X X . . . X . . . . . . . X X . . . X X . X . \n" . . . . X X . . . X . . . . . . . X X . . . X X . X .\s
+ ". . . X X X . . X X . X X X X X . X . . X . . . . . . \n" . . . X X X . . X X . X X X X X . X . . X . . . . . .\s
+ "X . . . . X . X . X . X . . . X . X . X X . X X . X X \n" X . . . . X . X . X . X . . . X . X . X X . X X . X X\s
+ "X . X . . X . X . X . X . X . X . X . . . . . X . X X \n" X . X . . X . X . X . X . X . X . X . . . . . X . X X\s
+ "X . X X X . . X . X . X . . . X . X . X X X . . . X X \n" X . X X X . . X . X . X . . . X . X . X X X . . . X X\s
+ "X X X X X X X X . X . X X X X X . X . X . X . X X X . \n" X X X X X X X X . X . X X X X X . X . X . X . X X X .\s
+ ". . . . . . . X . X . . . . . . . X X X X . . . X X X \n" . . . . . . . X . X . . . . . . . X X X X . . . X X X\s
+ "X X . . X . . X . X X X X X X X X X X X X X . . X . X \n" X X . . X . . X . X X X X X X X X X X X X X . . X . X\s
+ "X X X . X X X X . . X X X X . . X . . . . X . . X X X \n" X X X . X X X X . . X X X X . . X . . . . X . . X X X\s
+ ". . . . X . X X X . . . . X X X X . . X X X X . . . . \n" . . . . X . X X X . . . . X X X X . . X X X X . . . .\s
+ ". . X . . X . X . . . X . X X . X X . X . . . X . X . \n" . . X . . X . X . . . X . X X . X X . X . . . X . X .\s
+ "X X . . X . . X X X X X X X . . X . X X X X X X X . . \n" X X . . X . . X X X X X X X . . X . X X X X X X X . .\s
+ "X . X X . . X X . . . . . X . . . . . . X X . X X X . \n" X . X X . . X X . . . . . X . . . . . . X X . X X X .\s
+ "X . . X X . . X X . X . X . . . . X . X . . X . . X . \n" X . . X X . . X X . X . X . . . . X . X . . X . . X .\s
+ "X . X . X . . X . X X X X X X X X . X X X X . . X X . \n" X . X . X . . X . X X X X X X X X . X X X X . . X X .\s
+ "X X X X . . . X . . X X X . X X . . X . . . . X X X . \n" X X X X . . . X . . X X X . X X . . X . . . . X X X .\s
+ "X X . X . X . . . X . X . . . . X X . X . . X X . . . \n", X X . X . X . . . X . X . . . . X X . X . . X X . . .\s
""",
"X ", ". "); "X ", ". ");
AztecDetectorResult r = new AztecDetectorResult(matrix, NO_POINTS, true, 16, 4); AztecDetectorResult r = new AztecDetectorResult(matrix, NO_POINTS, true, 16, 4);
new Decoder().decode(r); new Decoder().decode(r);
@ -166,34 +171,35 @@ public final class DecoderTest extends Assert {
@Test(expected = FormatException.class) @Test(expected = FormatException.class)
public void testDecodeTooManyErrors2() throws FormatException { public void testDecodeTooManyErrors2() throws FormatException {
BitMatrix matrix = BitMatrix.parse("" BitMatrix matrix = BitMatrix.parse("""
+ ". X X . . X . X X . . . X . . X X X . . . X X . X X . \n" . X X . . X . X X . . . X . . X X X . . . X X . X X .\s
+ "X X . X X . . X . . . X X . . . X X . X X X . X . X X \n" X X . X X . . X . . . X X . . . X X . X X X . X . X X\s
+ ". . . . X . . . X X X . X X . X X X X . X X . . X . . \n" . . . . X . . . X X X . X X . X X X X . X X . . X . .\s
+ "X . X X . . X . . . X X . X X . X . X X . . . . . X . \n" X . X X . . X . . . X X . X X . X . X X . . . . . X .\s
+ "X X . X . . X . X X . . . . . X X . . . . . X . . . X \n" X X . X . . X . X X . . . . . X X . . . . . X . . . X\s
+ "X . . X . . . . . . X . . . X . X X X X X X X . . . X \n" X . . X . . . . . . X . . . X . X X X X X X X . . . X\s
+ "X . . X X . . X . . X X . . . . . X . . . . . X X X . \n" X . . X X . . X . . X X . . . . . X . . . . . X X X .\s
+ ". . X X X X . X . . . . . X X X X X X . . . . . . X X \n" . . X X X X . X . . . . . X X X X X X . . . . . . X X\s
+ "X . . . X . X X X X X X . . X X X . X . X X X X X X . \n" X . . . X . X X X X X X . . X X X . X . X X X X X X .\s
+ "X . . X X X . X X X X X X X X X X X X X . . . X . X X \n" X . . X X X . X X X X X X X X X X X X X . . . X . X X\s
+ ". . . . X X . . . X . . . . . . . X X . . . X X . X . \n" . . . . X X . . . X . . . . . . . X X . . . X X . X .\s
+ ". . . X X X . . X X . X X X X X . X . . X . . . . . . \n" . . . X X X . . X X . X X X X X . X . . X . . . . . .\s
+ "X . . . . X . X . X . X . . . X . X . X X . X X . X X \n" X . . . . X . X . X . X . . . X . X . X X . X X . X X\s
+ "X . X . . X . X . X . X . X . X . X . . . . . X . X X \n" X . X . . X . X . X . X . X . X . X . . . . . X . X X\s
+ "X . X X X . . X . X . X . . . X . X . X X X . . . X X \n" X . X X X . . X . X . X . . . X . X . X X X . . . X X\s
+ "X X X X X X X X . X . X X X X X . X . X . X . X X X . \n" X X X X X X X X . X . X X X X X . X . X . X . X X X .\s
+ ". . . . . . . X . X . . . . . . . X X X X . . . X X X \n" . . . . . . . X . X . . . . . . . X X X X . . . X X X\s
+ "X X . . X . . X . X X X X X X X X X X X X X . . X . X \n" X X . . X . . X . X X X X X X X X X X X X X . . X . X\s
+ "X X X . X X X X . . X X X X . . X . . . . X . . X X X \n" X X X . X X X X . . X X X X . . X . . . . X . . X X X\s
+ ". . X X X X X . X . . . . X X X X . . X X X . X . X . \n" . . X X X X X . X . . . . X X X X . . X X X . X . X .\s
+ ". . X X . X . X . . . X . X X . X X . . . . X X . . . \n" . . X X . X . X . . . X . X X . X X . . . . X X . . .\s
+ "X . . . X . X . X X X X X X . . X . X X X X X . X . . \n" X . . . X . X . X X X X X X . . X . X X X X X . X . .\s
+ ". X . . . X X X . . . . . X . . . . . X X X X X . X . \n" . X . . . X X X . . . . . X . . . . . X X X X X . X .\s
+ "X . . X . X X X X . X . X . . . . X . X X . X . . X . \n" X . . X . X X X X . X . X . . . . X . X X . X . . X .\s
+ "X . . . X X . X . X X X X X X X X . X X X X . . X X . \n" X . . . X X . X . X X X X X X X X . X X X X . . X X .\s
+ ". X X X X . . X . . X X X . X X . . X . . . . X X X . \n" . X X X X . . X . . X X X . X X . . X . . . . X X X .\s
+ "X X . . . X X . . X . X . . . . X X . X . . X . X . X \n", X X . . . X X . . X . X . . . . X X . X . . X . X . X\s
""",
"X ", ". "); "X ", ". ");
AztecDetectorResult r = new AztecDetectorResult(matrix, NO_POINTS, true, 16, 4); AztecDetectorResult r = new AztecDetectorResult(matrix, NO_POINTS, true, 16, 4);
new Decoder().decode(r); new Decoder().decode(r);

View file

@ -59,29 +59,31 @@ public final class EncoderTest extends Assert {
@Test @Test
public void testEncode1() { public void testEncode1() {
testEncode("This is an example Aztec symbol for Wikipedia.", true, 3, testEncode("This is an example Aztec symbol for Wikipedia.", true, 3,
"X X X X X X X X \n" + """
"X X X X X X X X X X \n" + X X X X X X X X \s
"X X X X X X X X X X X \n" + X X X X X X X X X X\s
"X X X X X X X X X X X \n" + X X X X X X X X X X X \s
" X X X X X X X X X X X \n" + X X X X X X X X X X X\s
" X X X X X X X X X X X X X \n" + X X X X X X X X X X X \s
" X X X X X X X X X X X X \n" + X X X X X X X X X X X X X \s
"X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X \s
"X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X \s
"X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X \n" + X X X X X X X X X X\s
" X X X X X X X X X X \n" + X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X \s
" X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X\s
" X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X \s
" X X X X X X X X \n" + X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X \n" + X X X X X X X X \s
" X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X\s
" X X X \n" + X X X X X X X X X X X X \s
" X X X X X X X X X X \n" + X X X \s
" X X X X X X X X X X \n"); X X X X X X X X X X\s
X X X X X X X X X X\s
""");
} }
@Test @Test
@ -89,47 +91,49 @@ public final class EncoderTest extends Assert {
testEncode("Aztec Code is a public domain 2D matrix barcode symbology" + testEncode("Aztec Code is a public domain 2D matrix barcode symbology" +
" of nominally square symbols built on a square grid with a " + " of nominally square symbols built on a square grid with a " +
"distinctive square bullseye pattern at their center.", false, 6, "distinctive square bullseye pattern at their center.", false, 6,
" X X X X X X X X X X X X X X X \n" + """
" X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X \s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X\s
" X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X \s
"X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X \s
"X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X \s
"X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X \s
"X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X\s
" X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X \s
" X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X \n"); X X X X X X X X X X X X X X X X\s
X X X X X X X X X X X X X \s
""");
} }
@Test @Test

View file

@ -100,10 +100,13 @@ public final class AddressBookParsedResultTestCase extends Assert {
@Test @Test
public void testQuotedPrintable() { public void testQuotedPrintable() {
doTest("BEGIN:VCARD\r\nADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;" + doTest("""
"=38=38=20=4C=79=6E=62=72=6F=6F=6B=0D=0A=43=\r\n" + BEGIN:VCARD
"=4F=20=36=39=39=\r\n" + ADR;HOME;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:;;\
"=39=39;;;\r\nEND:VCARD", =38=38=20=4C=79=6E=62=72=6F=6F=6B=0D=0A=43=
=4F=20=36=39=39=
=39=39;;;
END:VCARD""",
null, null, null, new String[] {"88 Lynbrook\r\nCO 69999"}, null, null, null, new String[] {"88 Lynbrook\r\nCO 69999"},
null, null, null, null, null, null, null); null, null, null, null, null, null, null);
} }

View file

@ -51,100 +51,132 @@ public final class CalendarParsedResultTestCase extends Assert {
@Test @Test
public void testStartEnd() { public void testStartEnd() {
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"DTSTART:20080504T123456Z\r\n" + BEGIN:VCALENDAR
"DTEND:20080505T234555Z\r\n" + BEGIN:VEVENT
"END:VEVENT\r\nEND:VCALENDAR", DTSTART:20080504T123456Z
DTEND:20080505T234555Z
END:VEVENT
END:VCALENDAR""",
null, null, null, "20080504T123456Z", "20080505T234555Z"); null, null, null, "20080504T123456Z", "20080505T234555Z");
} }
@Test @Test
public void testNoVCalendar() { public void testNoVCalendar() {
doTest( doTest(
"BEGIN:VEVENT\r\n" + """
"DTSTART:20080504T123456Z\r\n" + BEGIN:VEVENT
"DTEND:20080505T234555Z\r\n" + DTSTART:20080504T123456Z
"END:VEVENT", DTEND:20080505T234555Z
END:VEVENT""",
null, null, null, "20080504T123456Z", "20080505T234555Z"); null, null, null, "20080504T123456Z", "20080505T234555Z");
} }
@Test @Test
public void testStart() { public void testStart() {
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"DTSTART:20080504T123456Z\r\n" + BEGIN:VCALENDAR
"END:VEVENT\r\nEND:VCALENDAR", BEGIN:VEVENT
DTSTART:20080504T123456Z
END:VEVENT
END:VCALENDAR""",
null, null, null, "20080504T123456Z", null); null, null, null, "20080504T123456Z", null);
} }
@Test @Test
public void testDuration() { public void testDuration() {
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"DTSTART:20080504T123456Z\r\n" + BEGIN:VCALENDAR
"DURATION:P1D\r\n" + BEGIN:VEVENT
"END:VEVENT\r\nEND:VCALENDAR", DTSTART:20080504T123456Z
DURATION:P1D
END:VEVENT
END:VCALENDAR""",
null, null, null, "20080504T123456Z", "20080505T123456Z"); null, null, null, "20080504T123456Z", "20080505T123456Z");
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"DTSTART:20080504T123456Z\r\n" + BEGIN:VCALENDAR
"DURATION:P1DT2H3M4S\r\n" + BEGIN:VEVENT
"END:VEVENT\r\nEND:VCALENDAR", DTSTART:20080504T123456Z
DURATION:P1DT2H3M4S
END:VEVENT
END:VCALENDAR""",
null, null, null, "20080504T123456Z", "20080505T143800Z"); null, null, null, "20080504T123456Z", "20080505T143800Z");
} }
@Test @Test
public void testSummary() { public void testSummary() {
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"SUMMARY:foo\r\n" + BEGIN:VCALENDAR
"DTSTART:20080504T123456Z\r\n" + BEGIN:VEVENT
"END:VEVENT\r\nEND:VCALENDAR", SUMMARY:foo
DTSTART:20080504T123456Z
END:VEVENT
END:VCALENDAR""",
null, "foo", null, "20080504T123456Z", null); null, "foo", null, "20080504T123456Z", null);
} }
@Test @Test
public void testLocation() { public void testLocation() {
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"LOCATION:Miami\r\n" + BEGIN:VCALENDAR
"DTSTART:20080504T123456Z\r\n" + BEGIN:VEVENT
"END:VEVENT\r\nEND:VCALENDAR", LOCATION:Miami
DTSTART:20080504T123456Z
END:VEVENT
END:VCALENDAR""",
null, null, "Miami", "20080504T123456Z", null); null, null, "Miami", "20080504T123456Z", null);
} }
@Test @Test
public void testDescription() { public void testDescription() {
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"DTSTART:20080504T123456Z\r\n" + BEGIN:VCALENDAR
"DESCRIPTION:This is a test\r\n" + BEGIN:VEVENT
"END:VEVENT\r\nEND:VCALENDAR", DTSTART:20080504T123456Z
DESCRIPTION:This is a test
END:VEVENT
END:VCALENDAR""",
"This is a test", null, null, "20080504T123456Z", null); "This is a test", null, null, "20080504T123456Z", null);
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"DTSTART:20080504T123456Z\r\n" + BEGIN:VCALENDAR
"DESCRIPTION:This is a test\r\n\t with a continuation\r\n" + BEGIN:VEVENT
"END:VEVENT\r\nEND:VCALENDAR", DTSTART:20080504T123456Z
DESCRIPTION:This is a test
with a continuation
END:VEVENT
END:VCALENDAR""",
"This is a test with a continuation", null, null, "20080504T123456Z", null); "This is a test with a continuation", null, null, "20080504T123456Z", null);
} }
@Test @Test
public void testGeo() { public void testGeo() {
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"DTSTART:20080504T123456Z\r\n" + BEGIN:VCALENDAR
"GEO:-12.345;-45.678\r\n" + BEGIN:VEVENT
"END:VEVENT\r\nEND:VCALENDAR", DTSTART:20080504T123456Z
GEO:-12.345;-45.678
END:VEVENT
END:VCALENDAR""",
null, null, null, "20080504T123456Z", null, null, null, -12.345, -45.678); null, null, null, "20080504T123456Z", null, null, null, -12.345, -45.678);
} }
@Test @Test
public void testBadGeo() { public void testBadGeo() {
// Not parsed as VEVENT // Not parsed as VEVENT
Result fakeResult = new Result("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + Result fakeResult = new Result("""
"GEO:-12.345\r\n" + BEGIN:VCALENDAR
"END:VEVENT\r\nEND:VCALENDAR", null, null, BarcodeFormat.QR_CODE); BEGIN:VEVENT
GEO:-12.345
END:VEVENT
END:VCALENDAR""", null, null, BarcodeFormat.QR_CODE);
ParsedResult result = ResultParser.parseResult(fakeResult); ParsedResult result = ResultParser.parseResult(fakeResult);
assertSame(ParsedResultType.TEXT, result.getType()); assertSame(ParsedResultType.TEXT, result.getType());
} }
@ -152,42 +184,49 @@ public final class CalendarParsedResultTestCase extends Assert {
@Test @Test
public void testOrganizer() { public void testOrganizer() {
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"DTSTART:20080504T123456Z\r\n" + BEGIN:VCALENDAR
"ORGANIZER:mailto:bob@example.org\r\n" + BEGIN:VEVENT
"END:VEVENT\r\nEND:VCALENDAR", DTSTART:20080504T123456Z
ORGANIZER:mailto:bob@example.org
END:VEVENT
END:VCALENDAR""",
null, null, null, "20080504T123456Z", null, "bob@example.org", null, Double.NaN, Double.NaN); null, null, null, "20080504T123456Z", null, "bob@example.org", null, Double.NaN, Double.NaN);
} }
@Test @Test
public void testAttendees() { public void testAttendees() {
doTest( doTest(
"BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\n" + """
"DTSTART:20080504T123456Z\r\n" + BEGIN:VCALENDAR
"ATTENDEE:mailto:bob@example.org\r\n" + BEGIN:VEVENT
"ATTENDEE:mailto:alice@example.org\r\n" + DTSTART:20080504T123456Z
"END:VEVENT\r\nEND:VCALENDAR", ATTENDEE:mailto:bob@example.org
ATTENDEE:mailto:alice@example.org
END:VEVENT
END:VCALENDAR""",
null, null, null, "20080504T123456Z", null, null, null, null, null, "20080504T123456Z", null, null,
new String[] {"bob@example.org", "alice@example.org"}, Double.NaN, Double.NaN); new String[] {"bob@example.org", "alice@example.org"}, Double.NaN, Double.NaN);
} }
@Test @Test
public void testVEventEscapes() { public void testVEventEscapes() {
doTest("BEGIN:VEVENT\n" + doTest("""
"CREATED:20111109T110351Z\n" + BEGIN:VEVENT
"LAST-MODIFIED:20111109T170034Z\n" + CREATED:20111109T110351Z
"DTSTAMP:20111109T170034Z\n" + LAST-MODIFIED:20111109T170034Z
"UID:0f6d14ef-6cb7-4484-9080-61447ccdf9c2\n" + DTSTAMP:20111109T170034Z
"SUMMARY:Summary line\n" + UID:0f6d14ef-6cb7-4484-9080-61447ccdf9c2
"CATEGORIES:Private\n" + SUMMARY:Summary line
"DTSTART;TZID=Europe/Vienna:20111110T110000\n" + CATEGORIES:Private
"DTEND;TZID=Europe/Vienna:20111110T120000\n" + DTSTART;TZID=Europe/Vienna:20111110T110000
"LOCATION:Location\\, with\\, escaped\\, commas\n" + DTEND;TZID=Europe/Vienna:20111110T120000
"DESCRIPTION:Meeting with a friend\\nlook at homepage first\\n\\n\n" + LOCATION:Location\\, with\\, escaped\\, commas
" \\n\n" + DESCRIPTION:Meeting with a friend\\nlook at homepage first\\n\\n
"SEQUENCE:1\n" + \\n
"X-MOZ-GENERATION:1\n" + SEQUENCE:1
"END:VEVENT", X-MOZ-GENERATION:1
END:VEVENT""",
"Meeting with a friend\nlook at homepage first\n\n\n \n", "Meeting with a friend\nlook at homepage first\n\n\n \n",
"Summary line", "Summary line",
"Location, with, escaped, commas", "Location, with, escaped, commas",
@ -197,10 +236,11 @@ public final class CalendarParsedResultTestCase extends Assert {
@Test @Test
public void testAllDayValueDate() { public void testAllDayValueDate() {
doTest("BEGIN:VEVENT\n" + doTest("""
"DTSTART;VALUE=DATE:20111110\n" + BEGIN:VEVENT
"DTEND;VALUE=DATE:20111110\n" + DTSTART;VALUE=DATE:20111110
"END:VEVENT", DTEND;VALUE=DATE:20111110
END:VEVENT""",
null, null, null, "20111110T000000Z", "20111110T000000Z"); null, null, null, "20111110T000000Z", "20111110T000000Z");
} }

View file

@ -212,22 +212,40 @@ public final class ParsedReaderResultTestCase extends Assert {
@Test @Test
public void testVEvent() { public void testVEvent() {
// UTC times // UTC times
doTestResult("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504T123456Z\r\n" + doTestResult("""
"DTEND:20080505T234555Z\r\nEND:VEVENT\r\nEND:VCALENDAR", BEGIN:VCALENDAR
BEGIN:VEVENT
SUMMARY:foo
DTSTART:20080504T123456Z
DTEND:20080505T234555Z
END:VEVENT
END:VCALENDAR""",
"foo\n" + formatTime(2008, 5, 4, 12, 34, 56) + "\n" + formatTime(2008, 5, 5, 23, 45, 55), "foo\n" + formatTime(2008, 5, 4, 12, 34, 56) + "\n" + formatTime(2008, 5, 5, 23, 45, 55),
ParsedResultType.CALENDAR); ParsedResultType.CALENDAR);
doTestResult("BEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504T123456Z\r\n" + doTestResult("""
"DTEND:20080505T234555Z\r\nEND:VEVENT", "foo\n" + formatTime(2008, 5, 4, 12, 34, 56) + "\n" + BEGIN:VEVENT
SUMMARY:foo
DTSTART:20080504T123456Z
DTEND:20080505T234555Z
END:VEVENT""", "foo\n" + formatTime(2008, 5, 4, 12, 34, 56) + "\n" +
formatTime(2008, 5, 5, 23, 45, 55), formatTime(2008, 5, 5, 23, 45, 55),
ParsedResultType.CALENDAR); ParsedResultType.CALENDAR);
// Local times // Local times
doTestResult("BEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504T123456\r\n" + doTestResult("""
"DTEND:20080505T234555\r\nEND:VEVENT", "foo\n" + formatTime(2008, 5, 4, 12, 34, 56) + "\n" + BEGIN:VEVENT
SUMMARY:foo
DTSTART:20080504T123456
DTEND:20080505T234555
END:VEVENT""", "foo\n" + formatTime(2008, 5, 4, 12, 34, 56) + "\n" +
formatTime(2008, 5, 5, 23, 45, 55), formatTime(2008, 5, 5, 23, 45, 55),
ParsedResultType.CALENDAR); ParsedResultType.CALENDAR);
// Date only (all day event) // Date only (all day event)
doTestResult("BEGIN:VEVENT\r\nSUMMARY:foo\r\nDTSTART:20080504\r\n" + doTestResult("""
"DTEND:20080505\r\nEND:VEVENT", "foo\n" + formatDate(2008, 5, 4) + "\n" + BEGIN:VEVENT
SUMMARY:foo
DTSTART:20080504
DTEND:20080505
END:VEVENT""", "foo\n" + formatDate(2008, 5, 4) + "\n" +
formatDate(2008, 5, 5), formatDate(2008, 5, 5),
ParsedResultType.CALENDAR); ParsedResultType.CALENDAR);
// Start time only // Start time only

View file

@ -42,7 +42,6 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.DirectoryStream; import java.nio.file.DirectoryStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.List; import java.util.List;
@ -66,10 +65,10 @@ public abstract class AbstractBlackBoxTestCase extends Assert {
public static Path buildTestBase(String testBasePathSuffix) { public static Path buildTestBase(String testBasePathSuffix) {
// A little workaround to prevent aggravation in my IDE // A little workaround to prevent aggravation in my IDE
Path testBase = Paths.get(testBasePathSuffix); Path testBase = Path.of(testBasePathSuffix);
if (!Files.exists(testBase)) { if (!Files.exists(testBase)) {
// try starting with 'core' since the test base is often given as the project root // try starting with 'core' since the test base is often given as the project root
testBase = Paths.get("core").resolve(testBasePathSuffix); testBase = Path.of("core").resolve(testBasePathSuffix);
} }
return testBase; return testBase;
} }
@ -143,7 +142,7 @@ public abstract class AbstractBlackBoxTestCase extends Assert {
int[] tryHarderMisreadCounts = new int[testCount]; int[] tryHarderMisreadCounts = new int[testCount];
for (Path testImage : imageFiles) { for (Path testImage : imageFiles) {
log.info(String.format("Starting %s", testImage)); log.info("Starting %s".formatted(testImage));
BufferedImage image = ImageIO.read(testImage.toFile()); BufferedImage image = ImageIO.read(testImage.toFile());
@ -181,7 +180,7 @@ public abstract class AbstractBlackBoxTestCase extends Assert {
misreadCounts[x]++; misreadCounts[x]++;
} }
} catch (ReaderException ignored) { } catch (ReaderException ignored) {
log.fine(String.format("could not read at rotation %f", rotation)); log.fine("could not read at rotation %f".formatted(rotation));
} }
try { try {
if (decode(bitmap, rotation, expectedText, expectedMetadata, true)) { if (decode(bitmap, rotation, expectedText, expectedMetadata, true)) {
@ -190,7 +189,7 @@ public abstract class AbstractBlackBoxTestCase extends Assert {
tryHarderMisreadCounts[x]++; tryHarderMisreadCounts[x]++;
} }
} catch (ReaderException ignored) { } catch (ReaderException ignored) {
log.fine(String.format("could not read at rotation %f w/TH", rotation)); log.fine("could not read at rotation %f w/TH".formatted(rotation));
} }
} }
} }
@ -203,16 +202,16 @@ public abstract class AbstractBlackBoxTestCase extends Assert {
for (int x = 0; x < testResults.size(); x++) { for (int x = 0; x < testResults.size(); x++) {
TestResult testResult = testResults.get(x); TestResult testResult = testResults.get(x);
log.info(String.format("Rotation %d degrees:", (int) testResult.getRotation())); log.info("Rotation %d degrees:".formatted((int) testResult.getRotation()));
log.info(String.format(" %d of %d images passed (%d required)", log.info(" %d of %d images passed (%d required)".formatted(
passedCounts[x], imageFiles.size(), testResult.getMustPassCount())); passedCounts[x], imageFiles.size(), testResult.getMustPassCount()));
int failed = imageFiles.size() - passedCounts[x]; int failed = imageFiles.size() - passedCounts[x];
log.info(String.format(" %d failed due to misreads, %d not detected", log.info(" %d failed due to misreads, %d not detected".formatted(
misreadCounts[x], failed - misreadCounts[x])); misreadCounts[x], failed - misreadCounts[x]));
log.info(String.format(" %d of %d images passed with try harder (%d required)", log.info(" %d of %d images passed with try harder (%d required)".formatted(
tryHarderCounts[x], imageFiles.size(), testResult.getTryHarderCount())); tryHarderCounts[x], imageFiles.size(), testResult.getTryHarderCount()));
failed = imageFiles.size() - tryHarderCounts[x]; failed = imageFiles.size() - tryHarderCounts[x];
log.info(String.format(" %d failed due to misreads, %d not detected", log.info(" %d failed due to misreads, %d not detected".formatted(
tryHarderMisreadCounts[x], failed - tryHarderMisreadCounts[x])); tryHarderMisreadCounts[x], failed - tryHarderMisreadCounts[x]));
totalFound += passedCounts[x] + tryHarderCounts[x]; totalFound += passedCounts[x] + tryHarderCounts[x];
totalMustPass += testResult.getMustPassCount() + testResult.getTryHarderCount(); totalMustPass += testResult.getMustPassCount() + testResult.getTryHarderCount();
@ -221,18 +220,18 @@ public abstract class AbstractBlackBoxTestCase extends Assert {
} }
int totalTests = imageFiles.size() * testCount * 2; int totalTests = imageFiles.size() * testCount * 2;
log.info(String.format("Decoded %d images out of %d (%d%%, %d required)", log.info("Decoded %d images out of %d (%d%%, %d required)".formatted(
totalFound, totalTests, totalFound * 100 / totalTests, totalMustPass)); totalFound, totalTests, totalFound * 100 / totalTests, totalMustPass));
if (totalFound > totalMustPass) { if (totalFound > totalMustPass) {
log.warning(String.format("+++ Test too lax by %d images", totalFound - totalMustPass)); log.warning("+++ Test too lax by %d images".formatted(totalFound - totalMustPass));
} else if (totalFound < totalMustPass) { } else if (totalFound < totalMustPass) {
log.warning(String.format("--- Test failed by %d images", totalMustPass - totalFound)); log.warning("--- Test failed by %d images".formatted(totalMustPass - totalFound));
} }
if (totalMisread < totalMaxMisread) { if (totalMisread < totalMaxMisread) {
log.warning(String.format("+++ Test expects too many misreads by %d images", totalMaxMisread - totalMisread)); log.warning("+++ Test expects too many misreads by %d images".formatted(totalMaxMisread - totalMisread));
} else if (totalMisread > totalMaxMisread) { } else if (totalMisread > totalMaxMisread) {
log.warning(String.format("--- Test had too many misreads by %d images", totalMisread - totalMaxMisread)); log.warning("--- Test had too many misreads by %d images".formatted(totalMisread - totalMaxMisread));
} }
// Then run through again and assert if any failed // Then run through again and assert if any failed
@ -266,7 +265,7 @@ public abstract class AbstractBlackBoxTestCase extends Assert {
Map<?,?> expectedMetadata, Map<?,?> expectedMetadata,
boolean tryHarder) throws ReaderException { boolean tryHarder) throws ReaderException {
String suffix = String.format(" (%srotation: %d)", tryHarder ? "try harder, " : "", (int) rotation); String suffix = " (%srotation: %d)".formatted(tryHarder ? "try harder, " : "", (int) rotation);
Map<DecodeHintType,Object> hints = this.hints.clone(); Map<DecodeHintType,Object> hints = this.hints.clone();
if (tryHarder) { if (tryHarder) {
@ -289,14 +288,14 @@ public abstract class AbstractBlackBoxTestCase extends Assert {
} }
if (expectedFormat != result.getBarcodeFormat()) { if (expectedFormat != result.getBarcodeFormat()) {
log.info(String.format("Format mismatch: expected '%s' but got '%s'%s", log.info("Format mismatch: expected '%s' but got '%s'%s".formatted(
expectedFormat, result.getBarcodeFormat(), suffix)); expectedFormat, result.getBarcodeFormat(), suffix));
return false; return false;
} }
String resultText = result.getText(); String resultText = result.getText();
if (!expectedText.equals(resultText)) { if (!expectedText.equals(resultText)) {
log.info(String.format("Content mismatch: expected '%s' but got '%s'%s", log.info("Content mismatch: expected '%s' but got '%s'%s".formatted(
expectedText, resultText, suffix)); expectedText, resultText, suffix));
return false; return false;
} }
@ -307,7 +306,7 @@ public abstract class AbstractBlackBoxTestCase extends Assert {
Object expectedValue = metadatum.getValue(); Object expectedValue = metadatum.getValue();
Object actualValue = resultMetadata == null ? null : resultMetadata.get(key); Object actualValue = resultMetadata == null ? null : resultMetadata.get(key);
if (!expectedValue.equals(actualValue)) { if (!expectedValue.equals(actualValue)) {
log.info(String.format("Metadata mismatch for key '%s': expected '%s' but got '%s'", log.info("Metadata mismatch for key '%s': expected '%s' but got '%s'".formatted(
key, expectedValue, actualValue)); key, expectedValue, actualValue));
return false; return false;
} }

View file

@ -83,7 +83,7 @@ public abstract class AbstractNegativeBlackBoxTestCase extends AbstractBlackBoxT
List<Path> imageFiles = getImageFiles(); List<Path> imageFiles = getImageFiles();
int[] falsePositives = new int[testResults.size()]; int[] falsePositives = new int[testResults.size()];
for (Path testImage : imageFiles) { for (Path testImage : imageFiles) {
log.info(String.format("Starting %s", testImage)); log.info("Starting %s".formatted(testImage));
BufferedImage image = ImageIO.read(testImage.toFile()); BufferedImage image = ImageIO.read(testImage.toFile());
if (image == null) { if (image == null) {
throw new IOException("Could not read image: " + testImage); throw new IOException("Could not read image: " + testImage);
@ -106,14 +106,14 @@ public abstract class AbstractNegativeBlackBoxTestCase extends AbstractBlackBoxT
} }
if (totalFalsePositives < totalAllowed) { if (totalFalsePositives < totalAllowed) {
log.warning(String.format("+++ Test too lax by %d images", totalAllowed - totalFalsePositives)); log.warning("+++ Test too lax by %d images".formatted(totalAllowed - totalFalsePositives));
} else if (totalFalsePositives > totalAllowed) { } else if (totalFalsePositives > totalAllowed) {
log.warning(String.format("--- Test failed by %d images", totalFalsePositives - totalAllowed)); log.warning("--- Test failed by %d images".formatted(totalFalsePositives - totalAllowed));
} }
for (int x = 0; x < testResults.size(); x++) { for (int x = 0; x < testResults.size(); x++) {
TestResult testResult = testResults.get(x); TestResult testResult = testResults.get(x);
log.info(String.format("Rotation %d degrees: %d of %d images were false positives (%d allowed)", log.info("Rotation %d degrees: %d of %d images were false positives (%d allowed)".formatted(
(int) testResult.getRotation(), falsePositives[x], imageFiles.size(), (int) testResult.getRotation(), falsePositives[x], imageFiles.size(),
testResult.getFalsePositivesAllowed())); testResult.getFalsePositivesAllowed()));
assertTrue("Rotation " + testResult.getRotation() + " degrees: Too many false positives found", assertTrue("Rotation " + testResult.getRotation() + " degrees: Too many false positives found",
@ -135,7 +135,7 @@ public abstract class AbstractNegativeBlackBoxTestCase extends AbstractBlackBoxT
Result result; Result result;
try { try {
result = getReader().decode(bitmap); result = getReader().decode(bitmap);
log.info(String.format("Found false positive: '%s' with format '%s' (rotation: %d)", log.info("Found false positive: '%s' with format '%s' (rotation: %d)".formatted(
result.getText(), result.getBarcodeFormat(), (int) rotationInDegrees)); result.getText(), result.getBarcodeFormat(), (int) rotationInDegrees));
return false; return false;
} catch (ReaderException re) { } catch (ReaderException re) {
@ -147,7 +147,7 @@ public abstract class AbstractNegativeBlackBoxTestCase extends AbstractBlackBoxT
hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
try { try {
result = getReader().decode(bitmap, hints); result = getReader().decode(bitmap, hints);
log.info(String.format("Try harder found false positive: '%s' with format '%s' (rotation: %d)", log.info("Try harder found false positive: '%s' with format '%s' (rotation: %d)".formatted(
result.getText(), result.getBarcodeFormat(), (int) rotationInDegrees)); result.getText(), result.getBarcodeFormat(), (int) rotationInDegrees));
return false; return false;
} catch (ReaderException re) { } catch (ReaderException re) {

View file

@ -513,7 +513,7 @@ public final class ReedSolomonTestCase extends Assert {
private static String arrayToString(int[] data) { private static 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((i > 0 ? ",%X" : "%X").formatted(data[i]));
} }
return sb.append('}').toString(); return sb.append('}').toString();
} }

View file

@ -80,7 +80,7 @@ public final class PDF417BlackBox4TestCase extends AbstractBlackBoxTestCase {
Path testBase = getTestBase(); Path testBase = getTestBase();
for (Entry<String,List<Path>> testImageGroup : imageFiles.entrySet()) { for (Entry<String,List<Path>> testImageGroup : imageFiles.entrySet()) {
log.fine(String.format("Starting Image Group %s", testImageGroup.getKey())); log.fine("Starting Image Group %s".formatted(testImageGroup.getKey()));
String fileBaseName = testImageGroup.getKey(); String fileBaseName = testImageGroup.getKey();
String expectedText; String expectedText;
@ -133,23 +133,23 @@ public final class PDF417BlackBox4TestCase extends AbstractBlackBoxTestCase {
int numberOfTests = imageFiles.keySet().size(); int numberOfTests = imageFiles.keySet().size();
for (int x = 0; x < testResults.size(); x++) { for (int x = 0; x < testResults.size(); x++) {
TestResult testResult = testResults.get(x); TestResult testResult = testResults.get(x);
log.info(String.format("Rotation %d degrees:", (int) testResult.getRotation())); log.info("Rotation %d degrees:".formatted((int) testResult.getRotation()));
log.info(String.format(" %d of %d images passed (%d required)", passedCounts[x], numberOfTests, log.info(" %d of %d images passed (%d required)".formatted(passedCounts[x], numberOfTests,
testResult.getMustPassCount())); testResult.getMustPassCount()));
log.info(String.format(" %d of %d images passed with try harder (%d required)", tryHarderCounts[x], log.info(" %d of %d images passed with try harder (%d required)".formatted(tryHarderCounts[x],
numberOfTests, testResult.getTryHarderCount())); numberOfTests, testResult.getTryHarderCount()));
totalFound += passedCounts[x] + tryHarderCounts[x]; totalFound += passedCounts[x] + tryHarderCounts[x];
totalMustPass += testResult.getMustPassCount() + testResult.getTryHarderCount(); totalMustPass += testResult.getMustPassCount() + testResult.getTryHarderCount();
} }
int totalTests = numberOfTests * testCount * 2; int totalTests = numberOfTests * testCount * 2;
log.info(String.format("Decoded %d images out of %d (%d%%, %d required)", totalFound, totalTests, totalFound * log.info("Decoded %d images out of %d (%d%%, %d required)".formatted(totalFound, totalTests, totalFound *
100 / 100 /
totalTests, totalMustPass)); totalTests, totalMustPass));
if (totalFound > totalMustPass) { if (totalFound > totalMustPass) {
log.warning(String.format("+++ Test too lax by %d images", totalFound - totalMustPass)); log.warning("+++ Test too lax by %d images".formatted(totalFound - totalMustPass));
} else if (totalFound < totalMustPass) { } else if (totalFound < totalMustPass) {
log.warning(String.format("--- Test failed by %d images", totalMustPass - totalFound)); log.warning("--- Test failed by %d images".formatted(totalMustPass - totalFound));
} }
// Then run through again and assert if any failed // Then run through again and assert if any failed

View file

@ -41,30 +41,32 @@ public final class PDF417WriterTestCase extends Assert {
BitMatrix matrix = writer.encode("Hello Google", BarcodeFormat.PDF_417, size, size, hints); BitMatrix matrix = writer.encode("Hello Google", BarcodeFormat.PDF_417, size, size, hints);
assertNotNull(matrix); assertNotNull(matrix);
String expected = String expected =
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + """
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" + X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
"X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n"; X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X\s
""";
assertEquals(expected, matrix.toString()); assertEquals(expected, matrix.toString());
} }

View file

@ -33,7 +33,6 @@ import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.Map; import java.util.Map;
@ -43,13 +42,13 @@ import java.util.Map;
*/ */
public final class QRCodeWriterTestCase extends Assert { public final class QRCodeWriterTestCase extends Assert {
private static final Path BASE_IMAGE_PATH = Paths.get("src/test/resources/golden/qrcode/"); private static final Path BASE_IMAGE_PATH = Path.of("src/test/resources/golden/qrcode/");
private static BufferedImage loadImage(String fileName) throws IOException { private static BufferedImage loadImage(String fileName) throws IOException {
Path file = BASE_IMAGE_PATH.resolve(fileName); Path file = BASE_IMAGE_PATH.resolve(fileName);
if (!Files.exists(file)) { if (!Files.exists(file)) {
// try starting with 'core' since the test base is often given as the project root // try starting with 'core' since the test base is often given as the project root
file = Paths.get("core/").resolve(BASE_IMAGE_PATH).resolve(fileName); file = Path.of("core/").resolve(BASE_IMAGE_PATH).resolve(fileName);
} }
assertTrue("Please download and install test images, and run from the 'core' directory", Files.exists(file)); assertTrue("Please download and install test images, and run from the 'core' directory", Files.exists(file));
return ImageIO.read(file.toFile()); return ImageIO.read(file.toFile());

View file

@ -97,34 +97,36 @@ public final class EncoderTestCase extends Assert {
@Test @Test
public void testEncode() throws WriterException { public void testEncode() throws WriterException {
QRCode qrCode = Encoder.encode("ABCDEF", ErrorCorrectionLevel.H); QRCode qrCode = Encoder.encode("ABCDEF", ErrorCorrectionLevel.H);
String expected = "<<\n" + String expected = """
" mode: ALPHANUMERIC\n" + <<
" ecLevel: H\n" + mode: ALPHANUMERIC
" version: 1\n" + ecLevel: H
" maskPattern: 0\n" + version: 1
" matrix:\n" + maskPattern: 0
" 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1\n" + matrix:
" 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 1 0 0 1\n" + 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
" 1 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0\n" + 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 1 0 0 1
" 0 0 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0\n" + 1 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0
" 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0\n" + 0 0 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0
" 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0\n" + 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0
" 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0\n" + 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0
" 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1\n" + 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0
" 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1\n" + 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1
" 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1\n" + 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1
" 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0\n" + 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1
" 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0
" 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1\n" + 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1\n" + 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1
">>\n"; 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
>>
""";
assertEquals(expected, qrCode.toString()); assertEquals(expected, qrCode.toString());
} }
@ -148,34 +150,36 @@ public final class EncoderTestCase extends Assert {
Map<EncodeHintType,Object> hints = new EnumMap<>(EncodeHintType.class); Map<EncodeHintType,Object> hints = new EnumMap<>(EncodeHintType.class);
hints.put(EncodeHintType.CHARACTER_SET, "UTF8"); hints.put(EncodeHintType.CHARACTER_SET, "UTF8");
QRCode qrCode = Encoder.encode("hello", ErrorCorrectionLevel.H, hints); QRCode qrCode = Encoder.encode("hello", ErrorCorrectionLevel.H, hints);
String expected = "<<\n" + String expected = """
" mode: BYTE\n" + <<
" ecLevel: H\n" + mode: BYTE
" version: 1\n" + ecLevel: H
" maskPattern: 3\n" + version: 1
" matrix:\n" + maskPattern: 3
" 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1\n" + matrix:
" 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 0 0 1 1 0 0 1 1 1 1 0 0 0 1 1 0 1 0 0 0 0\n" + 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0
" 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 1 1 1 0\n" + 0 0 1 1 0 0 1 1 1 1 0 0 0 1 1 0 1 0 0 0 0
" 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1\n" + 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 1 0 1 1 1 0
" 1 1 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0\n" + 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1
" 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0\n" + 1 1 0 0 1 0 0 1 1 0 0 1 1 1 1 0 1 0 1 1 0
" 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1\n" + 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0
" 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0\n" + 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 1
" 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 1\n" + 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 0 0 1 0 0
" 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0\n" + 1 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 1
" 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 1 0 0 0\n" + 1 0 1 1 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0
" 1 0 1 1 1 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0\n" + 1 0 1 1 1 0 1 0 1 1 1 0 1 0 0 0 1 1 0 0 0
" 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0\n" + 1 0 1 1 1 0 1 0 1 1 0 0 0 1 0 0 1 0 0 0 0
" 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0\n" + 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 1 0 1 1 0
">>\n"; 1 1 1 1 1 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 0
>>
""";
assertEquals(expected, qrCode.toString()); assertEquals(expected, qrCode.toString());
} }
@ -185,34 +189,36 @@ public final class EncoderTestCase extends Assert {
hints.put(EncodeHintType.CHARACTER_SET, "Shift_JIS"); hints.put(EncodeHintType.CHARACTER_SET, "Shift_JIS");
// Nihon in Kanji // Nihon in Kanji
QRCode qrCode = Encoder.encode("\u65e5\u672c", ErrorCorrectionLevel.M, hints); QRCode qrCode = Encoder.encode("\u65e5\u672c", ErrorCorrectionLevel.M, hints);
String expected = "<<\n" + String expected = """
" mode: KANJI\n" + <<
" ecLevel: M\n" + mode: KANJI
" version: 1\n" + ecLevel: M
" maskPattern: 4\n" + version: 1
" matrix:\n" + maskPattern: 4
" 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1\n" + matrix:
" 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 1 0 0 0 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1\n" + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
" 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 0 1\n" + 1 0 0 0 1 0 1 1 1 0 0 0 1 1 1 1 1 1 0 0 1
" 1 1 1 1 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 1 1\n" + 0 1 1 0 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 0 1
" 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 1 0 0 1 1 0\n" + 1 1 1 1 0 1 1 1 0 0 1 0 1 1 0 0 0 0 1 1 1
" 0 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1\n" + 1 0 1 0 1 1 0 0 0 0 1 1 1 0 0 1 0 0 1 1 0
" 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 1 0 0 0\n" + 0 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 1
" 1 1 1 1 1 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0\n" + 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 1 0 0 0
" 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1\n" + 1 1 1 1 1 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0
" 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1\n" + 1 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 1
" 1 0 1 1 1 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 1\n" + 1 0 1 1 1 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1
" 1 0 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0\n" + 1 0 1 1 1 0 1 0 0 1 0 0 1 1 1 0 0 0 1 1 1
" 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0\n" + 1 0 1 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 0 0
" 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 0\n" + 1 0 0 0 0 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0
">>\n"; 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 0
>>
""";
assertEquals(expected, qrCode.toString()); assertEquals(expected, qrCode.toString());
} }
@ -221,34 +227,36 @@ public final class EncoderTestCase extends Assert {
Map<EncodeHintType,Object> hints = new EnumMap<>(EncodeHintType.class); Map<EncodeHintType,Object> hints = new EnumMap<>(EncodeHintType.class);
hints.put(EncodeHintType.CHARACTER_SET, "Shift_JIS"); hints.put(EncodeHintType.CHARACTER_SET, "Shift_JIS");
QRCode qrCode = Encoder.encode("0123", ErrorCorrectionLevel.M, hints); QRCode qrCode = Encoder.encode("0123", ErrorCorrectionLevel.M, hints);
String expected = "<<\n" + String expected = """
" mode: NUMERIC\n" + <<
" ecLevel: M\n" + mode: NUMERIC
" version: 1\n" + ecLevel: M
" maskPattern: 0\n" + version: 1
" matrix:\n" + maskPattern: 0
" 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1\n" + matrix:
" 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0\n" + 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
" 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0
" 0 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 0\n" + 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0
" 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0\n" + 0 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 0 1 0 1 0
" 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 0 1\n" + 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 1 0
" 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0\n" + 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 0 1 0 1
" 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 1\n" + 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 1 1 0
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0\n" + 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 1
" 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1\n" + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 1 0 0
" 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 0 1 0 1
" 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0 1 0 1 0 1 0
" 1 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 0\n" + 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1\n" + 1 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 0 0
">>\n"; 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1
>>
""";
assertEquals(expected, qrCode.toString()); assertEquals(expected, qrCode.toString());
} }
@ -290,34 +298,36 @@ public final class EncoderTestCase extends Assert {
hints.put(EncodeHintType.CHARACTER_SET, "UTF8"); hints.put(EncodeHintType.CHARACTER_SET, "UTF8");
hints.put(EncodeHintType.GS1_FORMAT, true); hints.put(EncodeHintType.GS1_FORMAT, true);
QRCode qrCode = Encoder.encode("hello", ErrorCorrectionLevel.H, hints); QRCode qrCode = Encoder.encode("hello", ErrorCorrectionLevel.H, hints);
String expected = "<<\n" + String expected = """
" mode: BYTE\n" + <<
" ecLevel: H\n" + mode: BYTE
" version: 1\n" + ecLevel: H
" maskPattern: 6\n" + version: 1
" matrix:\n" + maskPattern: 6
" 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 1 1\n" + matrix:
" 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 0\n" + 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0
" 0 1 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1\n" + 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 0
" 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 0 0 1 0 1\n" + 0 1 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1
" 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0\n" + 0 1 1 1 1 0 1 0 0 1 0 1 0 1 1 1 0 0 1 0 1
" 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 0 1\n" + 1 1 1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0
" 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1\n" + 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 0 0 1 0 0 1
" 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0\n" + 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 1 0 0 0 1
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 0 0\n" + 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 0 0
" 1 0 1 1 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 0 0\n" + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 1 0 0
" 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0\n" + 1 0 1 1 1 0 1 0 1 1 0 1 1 0 0 0 1 1 0 0 0
" 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 1 1\n" + 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0\n" + 1 0 1 1 1 0 1 0 0 0 1 0 0 1 0 0 1 0 1 1 1
" 1 1 1 1 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0\n" + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0
">>\n"; 1 1 1 1 1 1 1 0 0 1 0 1 0 0 1 0 0 0 0 0 0
>>
""";
assertEquals(expected, qrCode.toString()); assertEquals(expected, qrCode.toString());
} }
@ -913,70 +923,74 @@ public final class EncoderTestCase extends Assert {
} }
private static void verifyGS1EncodedData(QRCode qrCode) { private static void verifyGS1EncodedData(QRCode qrCode) {
String expected = "<<\n" + String expected = """
" mode: ALPHANUMERIC\n" + <<
" ecLevel: H\n" + mode: ALPHANUMERIC
" version: 2\n" + ecLevel: H
" maskPattern: 2\n" + version: 2
" matrix:\n" + maskPattern: 2
" 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1\n" + matrix:
" 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 0 0 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1\n" + 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0
" 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1\n" + 0 0 1 1 1 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 0 1 1 1
" 1 0 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1\n" + 0 0 0 1 1 1 0 1 0 0 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1
" 0 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 1 1\n" + 1 0 1 1 0 0 1 0 1 1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1
" 0 0 1 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0\n" + 0 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 0 1 1
" 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0\n" + 0 0 1 0 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1 0
" 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 0 0 0 0 1 1 0 0 1\n" + 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1 1 0 1 1 0 1 0 0 0
" 1 0 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 0 1\n" + 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 0 0 0 0 1 1 0 0 1
" 1 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 0\n" + 1 0 0 1 0 1 0 1 0 0 0 1 1 1 1 0 1 0 1 0 0 1 0 0 1
" 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0\n" + 1 0 1 0 0 1 1 1 0 1 1 0 0 1 0 0 1 1 1 1 1 1 0 0 0
" 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1\n" + 0 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 0 0 1 0 0 1 0
" 1 0 0 0 0 0 1 0 0 1 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1\n" + 1 1 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 1 1 1
" 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1\n" + 1 0 0 0 0 0 1 0 0 1 1 1 1 1 0 1 1 0 0 0 1 0 0 0 1
" 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0\n" + 1 0 1 1 1 0 1 0 1 0 1 0 0 1 1 1 1 1 1 1 1 0 0 0 1
" 1 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 0 1\n" + 1 0 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
" 1 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1\n" + 1 0 1 1 1 0 1 0 1 0 0 0 1 1 0 1 0 0 1 1 1 0 1 0 1
" 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 0 0 0 1 0 1 1\n" + 1 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 1 1 1 1 1
">>\n"; 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 0 0 0 1 0 1 1
>>
""";
assertEquals(expected, qrCode.toString()); assertEquals(expected, qrCode.toString());
} }
private static void verifyNotGS1EncodedData(QRCode qrCode) { private static void verifyNotGS1EncodedData(QRCode qrCode) {
String expected = "<<\n" + String expected = """
" mode: ALPHANUMERIC\n" + <<
" ecLevel: H\n" + mode: ALPHANUMERIC
" version: 1\n" + ecLevel: H
" maskPattern: 0\n" + version: 1
" matrix:\n" + maskPattern: 0
" 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1\n" + matrix:
" 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 0 1 1 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 1 0 0 1\n" + 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0
" 1 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0\n" + 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 1 0 0 1
" 0 0 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0\n" + 1 0 1 1 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0
" 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0\n" + 0 0 1 1 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0
" 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0\n" + 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0
" 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0\n" + 0 0 1 1 0 1 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0
" 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1\n" + 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 0 0 0
" 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1\n" + 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 0 0 1
" 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1\n" + 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 0 1
" 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0\n" + 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 1 0 0 0 0 1
" 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 0 1 0
" 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1\n" + 1 0 1 1 1 0 1 0 1 0 0 0 1 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1\n" + 1 0 0 0 0 0 1 0 0 1 1 0 1 1 0 1 0 0 0 1 1
">>\n"; 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 1 0 1
>>
""";
assertEquals(expected, qrCode.toString()); assertEquals(expected, qrCode.toString());
} }

View file

@ -62,27 +62,29 @@ public final class MatrixUtilTestCase extends Assert {
MatrixUtil.clearMatrix(matrix); MatrixUtil.clearMatrix(matrix);
MatrixUtil.embedBasicPatterns(Version.getVersionForNumber(1), matrix); MatrixUtil.embedBasicPatterns(Version.getVersionForNumber(1), matrix);
String expected = String expected =
" 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1\n" + """
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 1 \n" + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 0 \n" + 1 \s
" 1 \n" + 0 \s
" 0 \n" + 1 \s
" 1 \n" + 0 \s
" 0 0 0 0 0 0 0 0 1 \n" + 1 \s
" 1 1 1 1 1 1 1 0 \n" + 0 0 0 0 0 0 0 0 1 \s
" 1 0 0 0 0 0 1 0 \n" + 1 1 1 1 1 1 1 0 \s
" 1 0 1 1 1 0 1 0 \n" + 1 0 0 0 0 0 1 0 \s
" 1 0 1 1 1 0 1 0 \n" + 1 0 1 1 1 0 1 0 \s
" 1 0 1 1 1 0 1 0 \n" + 1 0 1 1 1 0 1 0 \s
" 1 0 0 0 0 0 1 0 \n" + 1 0 1 1 1 0 1 0 \s
" 1 1 1 1 1 1 1 0 \n"; 1 0 0 0 0 0 1 0 \s
1 1 1 1 1 1 1 0 \s
""";
assertEquals(expected, matrix.toString()); assertEquals(expected, matrix.toString());
} }
@ -94,31 +96,33 @@ public final class MatrixUtilTestCase extends Assert {
MatrixUtil.clearMatrix(matrix); MatrixUtil.clearMatrix(matrix);
MatrixUtil.embedBasicPatterns(Version.getVersionForNumber(2), matrix); MatrixUtil.embedBasicPatterns(Version.getVersionForNumber(2), matrix);
String expected = String expected =
" 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1\n" + """
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 1 \n" + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 0 \n" + 1 \s
" 1 \n" + 0 \s
" 0 \n" + 1 \s
" 1 \n" + 0 \s
" 0 \n" + 1 \s
" 1 \n" + 0 \s
" 0 \n" + 1 \s
" 1 1 1 1 1 1 \n" + 0 \s
" 0 0 0 0 0 0 0 0 1 1 0 0 0 1 \n" + 1 1 1 1 1 1 \s
" 1 1 1 1 1 1 1 0 1 0 1 0 1 \n" + 0 0 0 0 0 0 0 0 1 1 0 0 0 1 \s
" 1 0 0 0 0 0 1 0 1 0 0 0 1 \n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 \s
" 1 0 1 1 1 0 1 0 1 1 1 1 1 \n" + 1 0 0 0 0 0 1 0 1 0 0 0 1 \s
" 1 0 1 1 1 0 1 0 \n" + 1 0 1 1 1 0 1 0 1 1 1 1 1 \s
" 1 0 1 1 1 0 1 0 \n" + 1 0 1 1 1 0 1 0 \s
" 1 0 0 0 0 0 1 0 \n" + 1 0 1 1 1 0 1 0 \s
" 1 1 1 1 1 1 1 0 \n"; 1 0 0 0 0 0 1 0 \s
1 1 1 1 1 1 1 0 \s
""";
assertEquals(expected, matrix.toString()); assertEquals(expected, matrix.toString());
} }
@ -129,27 +133,29 @@ public final class MatrixUtilTestCase extends Assert {
MatrixUtil.clearMatrix(matrix); MatrixUtil.clearMatrix(matrix);
MatrixUtil.embedTypeInfo(ErrorCorrectionLevel.M, 5, matrix); MatrixUtil.embedTypeInfo(ErrorCorrectionLevel.M, 5, matrix);
String expected = String expected =
" 0 \n" + """
" 1 \n" + 0 \s
" 1 \n" + 1 \s
" 1 \n" + 1 \s
" 0 \n" + 1 \s
" 0 \n" + 0 \s
" \n" + 0 \s
" 1 \n" + \s
" 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0\n" + 1 \s
" \n" + 1 0 0 0 0 0 0 1 1 1 0 0 1 1 1 0
" \n" + \s
" \n" + \s
" \n" + \s
" \n" + \s
" 0 \n" + \s
" 0 \n" + 0 \s
" 0 \n" + 0 \s
" 0 \n" + 0 \s
" 0 \n" + 0 \s
" 0 \n" + 0 \s
" 1 \n"; 0 \s
1 \s
""";
assertEquals(expected, matrix.toString()); assertEquals(expected, matrix.toString());
} }
@ -162,27 +168,29 @@ public final class MatrixUtilTestCase extends Assert {
MatrixUtil.clearMatrix(matrix); MatrixUtil.clearMatrix(matrix);
MatrixUtil.maybeEmbedVersionInfo(Version.getVersionForNumber(7), matrix); MatrixUtil.maybeEmbedVersionInfo(Version.getVersionForNumber(7), matrix);
String expected = String expected =
" 0 0 1 \n" + """
" 0 1 0 \n" + 0 0 1 \s
" 0 1 0 \n" + 0 1 0 \s
" 0 1 1 \n" + 0 1 0 \s
" 1 1 1 \n" + 0 1 1 \s
" 0 0 0 \n" + 1 1 1 \s
" \n" + 0 0 0 \s
" \n" + \s
" \n" + \s
" \n" + \s
" 0 0 0 0 1 0 \n" + \s
" 0 1 1 1 1 0 \n" + 0 0 0 0 1 0 \s
" 1 0 0 1 1 0 \n" + 0 1 1 1 1 0 \s
" \n" + 1 0 0 1 1 0 \s
" \n" + \s
" \n" + \s
" \n" + \s
" \n" + \s
" \n" + \s
" \n" + \s
" \n"; \s
\s
""";
assertEquals(expected, matrix.toString()); assertEquals(expected, matrix.toString());
} }
@ -195,27 +203,29 @@ public final class MatrixUtilTestCase extends Assert {
BitArray bits = new BitArray(); BitArray bits = new BitArray();
MatrixUtil.embedDataBits(bits, -1, matrix); MatrixUtil.embedDataBits(bits, -1, matrix);
String expected = String expected =
" 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1\n" + """
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 0 0 0 0 0 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n" + 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" + 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
" 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"; 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
""";
assertEquals(expected, matrix.toString()); assertEquals(expected, matrix.toString());
} }
@ -236,27 +246,29 @@ public final class MatrixUtilTestCase extends Assert {
3, // Mask pattern 3 3, // Mask pattern 3
matrix); matrix);
String expected = String expected =
" 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1\n" + """
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1\n" + 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1
" 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1\n" + 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1
" 1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 1 1 0 1
" 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1\n" + 1 0 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1
" 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1\n" + 1 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 1 1 1 0 1
" 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1\n" + 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 0 0 0 1
" 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1
" 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0\n" + 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0
" 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0\n" + 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0
" 1 1 1 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 1 0\n" + 1 0 1 0 1 0 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0
" 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 0\n" + 1 1 1 1 0 1 1 0 1 0 1 1 1 0 0 1 1 1 0 1 0
" 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 1\n" + 1 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 1 0 1 0
" 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1\n" + 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 1 1 1 1 1
" 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0\n" + 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1
" 1 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0\n" + 1 1 1 1 1 1 1 0 1 1 1 1 0 0 0 0 1 0 1 1 0
" 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1\n" + 1 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 0 0 0 0 0
" 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0\n" + 1 0 1 1 1 0 1 0 0 1 0 0 1 1 0 0 1 0 0 1 1
" 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0\n" + 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 1 1 1 0
" 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0\n" + 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 0
" 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 0 1 0\n"; 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0
1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 0 1 0
""";
assertEquals(expected, matrix.toString()); assertEquals(expected, matrix.toString());
} }

View file

@ -62,13 +62,15 @@ public final class QRCodeTestCase extends Assert {
public void testToString1() { public void testToString1() {
QRCode qrCode = new QRCode(); QRCode qrCode = new QRCode();
String expected = String expected =
"<<\n" + """
" mode: null\n" + <<
" ecLevel: null\n" + mode: null
" version: null\n" + ecLevel: null
" maskPattern: -1\n" + version: null
" matrix: null\n" + maskPattern: -1
">>\n"; matrix: null
>>
""";
assertEquals(expected, qrCode.toString()); assertEquals(expected, qrCode.toString());
} }
@ -86,34 +88,36 @@ public final class QRCodeTestCase extends Assert {
} }
} }
qrCode.setMatrix(matrix); qrCode.setMatrix(matrix);
String expected = "<<\n" + String expected = """
" mode: BYTE\n" + <<
" ecLevel: H\n" + mode: BYTE
" version: 1\n" + ecLevel: H
" maskPattern: 3\n" + version: 1
" matrix:\n" + maskPattern: 3
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + matrix:
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" + 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" + 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
">>\n"; 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
>>
""";
assertEquals(expected, qrCode.toString()); assertEquals(expected, qrCode.toString());
} }

View file

@ -20,6 +20,9 @@
<artifactId>javase</artifactId> <artifactId>javase</artifactId>
<version>3.5.4-SNAPSHOT</version> <version>3.5.4-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties>
<java.version>17</java.version>
</properties>
<dependencies> <dependencies>
<dependency> <dependency>

View file

@ -22,7 +22,7 @@ import com.google.zxing.common.BitMatrix;
import com.beust.jcommander.JCommander; import com.beust.jcommander.JCommander;
import java.nio.file.Paths; import java.nio.file.Path;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
@ -59,7 +59,7 @@ public final class CommandLineEncoder {
config.contents.get(0), config.barcodeFormat, config.width, config.contents.get(0), config.barcodeFormat, config.width,
config.height, hints); config.height, hints);
MatrixToImageWriter.writeToPath(matrix, config.imageFormat, MatrixToImageWriter.writeToPath(matrix, config.imageFormat,
Paths.get(outFileString)); Path.of(outFileString));
} }
} }

View file

@ -23,7 +23,6 @@ import java.net.URISyntaxException;
import java.nio.file.DirectoryStream; import java.nio.file.DirectoryStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -64,7 +63,7 @@ public final class CommandLineRunner {
uri = new URI(inputPath); uri = new URI(inputPath);
} catch (URISyntaxException use) { } catch (URISyntaxException use) {
// Assume it must be a file // Assume it must be a file
if (!Files.exists(Paths.get(inputPath))) { if (!Files.exists(Path.of(inputPath))) {
throw use; throw use;
} }
uri = new URI("file", inputPath, null); uri = new URI("file", inputPath, null);
@ -109,7 +108,7 @@ public final class CommandLineRunner {
List<URI> expanded = new ArrayList<>(); List<URI> expanded = new ArrayList<>();
for (URI input : inputs) { for (URI input : inputs) {
if (isFileOrDir(input)) { if (isFileOrDir(input)) {
Path inputPath = Paths.get(input); Path inputPath = Path.of(input);
if (Files.isDirectory(inputPath)) { if (Files.isDirectory(inputPath)) {
try (DirectoryStream<Path> childPaths = Files.newDirectoryStream(inputPath)) { try (DirectoryStream<Path> childPaths = Files.newDirectoryStream(inputPath)) {
for (Path childPath : childPaths) { for (Path childPath : childPaths) {
@ -126,7 +125,7 @@ public final class CommandLineRunner {
for (int i = 0; i < expanded.size(); i++) { for (int i = 0; i < expanded.size(); i++) {
URI input = expanded.get(i); URI input = expanded.get(i);
if (input.getScheme() == null) { if (input.getScheme() == null) {
expanded.set(i, Paths.get(input.getRawPath()).toUri()); expanded.set(i, Path.of(input.getRawPath()).toUri());
} }
} }
return expanded; return expanded;
@ -137,7 +136,7 @@ public final class CommandLineRunner {
for (URI input : inputs) { for (URI input : inputs) {
boolean retain; boolean retain;
if (isFileOrDir(input)) { if (isFileOrDir(input)) {
Path inputPath = Paths.get(input); Path inputPath = Path.of(input);
retain = retain =
!inputPath.getFileName().toString().startsWith(".") && !inputPath.getFileName().toString().startsWith(".") &&
(recursive || !Files.isDirectory(inputPath)); (recursive || !Files.isDirectory(inputPath));
@ -153,7 +152,7 @@ public final class CommandLineRunner {
private static boolean isExpandable(Iterable<URI> inputs) { private static boolean isExpandable(Iterable<URI> inputs) {
for (URI input : inputs) { for (URI input : inputs) {
if (isFileOrDir(input) && Files.isDirectory(Paths.get(input))) { if (isFileOrDir(input) && Files.isDirectory(Path.of(input))) {
return true; return true;
} }
} }

View file

@ -39,7 +39,6 @@ import java.net.URI;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -88,11 +87,11 @@ final class DecodeWorker implements Callable<Integer> {
Path outDir; Path outDir;
String inputFileName; String inputFileName;
if ("file".equals(input.getScheme())) { if ("file".equals(input.getScheme())) {
Path inputPath = Paths.get(input); Path inputPath = Path.of(input);
outDir = inputPath.getParent(); outDir = inputPath.getParent();
inputFileName = inputPath.getFileName().toString(); inputFileName = inputPath.getFileName().toString();
} else { } else {
outDir = Paths.get(".").toRealPath(); outDir = Path.of(".").toRealPath();
String path = input.getPath(); String path = input.getPath();
if (path == null) { if (path == null) {
inputFileName = "input"; inputFileName = "input";
@ -172,7 +171,7 @@ final class DecodeWorker implements Callable<Integer> {
if (rawBytes != null) { if (rawBytes != null) {
for (byte b : rawBytes) { for (byte b : rawBytes) {
rawData.append(String.format("%02X", b & 0xff)); rawData.append("%02X".formatted(b & 0xff));
rawData.append(" "); rawData.append(" ");
} }
rawData.setLength(rawData.length() - 1); // chop off final space rawData.setLength(rawData.length() - 1); // chop off final space

View file

@ -35,7 +35,6 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.DirectoryStream; import java.nio.file.DirectoryStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -77,7 +76,7 @@ public final class HtmlAssetTranslator {
"(all|lang1[,lang2 ...]) (all|file1.html[ file2.html ...])"); "(all|lang1[,lang2 ...]) (all|file1.html[ file2.html ...])");
return; return;
} }
Path assetsDir = Paths.get(args[0]); Path assetsDir = Path.of(args[0]);
Collection<String> languagesToTranslate = parseLanguagesToTranslate(assetsDir, args[1]); Collection<String> languagesToTranslate = parseLanguagesToTranslate(assetsDir, args[1]);
List<String> restOfArgs = Arrays.asList(args).subList(2, args.length); List<String> restOfArgs = Arrays.asList(args).subList(2, args.length);
Collection<String> fileNamesToTranslate = parseFileNamesToTranslate(assetsDir, restOfArgs); Collection<String> fileNamesToTranslate = parseFileNamesToTranslate(assetsDir, restOfArgs);

View file

@ -27,7 +27,6 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.DirectoryStream; import java.nio.file.DirectoryStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
@ -92,7 +91,7 @@ public final class StringsResourceTranslator {
private StringsResourceTranslator() {} private StringsResourceTranslator() {}
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
Path resDir = Paths.get(args[0]); Path resDir = Path.of(args[0]);
Path valueDir = resDir.resolve("values"); Path valueDir = resDir.resolve("values");
Path stringsFile = valueDir.resolve("strings.xml"); Path stringsFile = valueDir.resolve("strings.xml");
Collection<String> forceRetranslation = Arrays.asList(args).subList(1, args.length); Collection<String> forceRetranslation = Arrays.asList(args).subList(1, args.length);

24
pom.xml
View file

@ -64,7 +64,7 @@
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version> <java.version>17</java.version>
<android.home>${env.ANDROID_HOME}</android.home> <android.home>${env.ANDROID_HOME}</android.home>
<proguard.plugin.version>2.6.1</proguard.plugin.version> <proguard.plugin.version>2.6.1</proguard.plugin.version>
<!-- This can't reference project.version as some subprojects version differently --> <!-- This can't reference project.version as some subprojects version differently -->
@ -74,6 +74,23 @@
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.openrewrite.maven</groupId>
<artifactId>rewrite-maven-plugin</artifactId>
<version>5.42.0</version>
<configuration>
<activeRecipes>
<recipe>org.openrewrite.java.migrate.UpgradeToJava17</recipe>
</activeRecipes>
</configuration>
<dependencies>
<dependency>
<groupId>org.openrewrite.recipe</groupId>
<artifactId>rewrite-migrate-java</artifactId>
<version>2.26.1</version>
</dependency>
</dependencies>
</plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>maven-javadoc-plugin</artifactId>
@ -140,12 +157,11 @@
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version> <version>3.13.0</version>
<configuration> <configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<compilerArgs> <compilerArgs>
<arg>-Xlint:all</arg> <arg>-Xlint:all</arg>
<arg>-Xlint:-serial</arg> <arg>-Xlint:-serial</arg>
</compilerArgs> </compilerArgs>
<release>${java.version}</release>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
@ -395,7 +411,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId> <artifactId>maven-checkstyle-plugin</artifactId>
<version>3.4.0</version> <version>3.5.0</version>
<configuration> <configuration>
<configLocation>src/checkstyle/checkstyle.xml</configLocation> <configLocation>src/checkstyle/checkstyle.xml</configLocation>
<includeTestSourceDirectory>true</includeTestSourceDirectory> <includeTestSourceDirectory>true</includeTestSourceDirectory>

View file

@ -38,6 +38,7 @@
<properties> <properties>
<gwt.version>2.10.0</gwt.version> <gwt.version>2.10.0</gwt.version>
<java.version>17</java.version>
</properties> </properties>
<build> <build>