From 70439d47c544d44aadc99c71cc406a0589c38e96 Mon Sep 17 00:00:00 2001 From: wslbal Date: Wed, 17 Jun 2020 11:16:00 +0900 Subject: [PATCH] 0617 1) testing method - MskCommandFactory, applyMask, reedSolomonComputeDivisor, getNumRawDataModules 2) Exception test with using 3 boundary value analysis 3) to use private methods and variables, make execute method and setter --- .../main/java/io/nayuki/qrcodegen/QrCode.java | 29 ++- .../java/io/nayuki/qrcodegen/QrCodeTest.java | 165 ++++++++++++++++++ .../java/io/nayuki/qrcodegen/QrSegment.java | 3 +- 3 files changed, 187 insertions(+), 10 deletions(-) create mode 100644 java/src/main/java/io/nayuki/qrcodegen/QrCodeTest.java diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrCode.java b/java/src/main/java/io/nayuki/qrcodegen/QrCode.java index 5ade16c..d486986 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrCode.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrCode.java @@ -190,7 +190,7 @@ public final class QrCode { BitBuffer bitBuffer = new BitBuffer(); for (QrSegment segment : segments) { bitBuffer.appendBits(segment.mode.modeBits, 4); - bitBuffer.appendBits(segment.numChars, segment.mode.numCharCountBits(version)); + bitBuffer.appendBits(segment.numberOfCharacters, segment.mode.numCharCountBits(version)); bitBuffer.appendData(segment.data); } return bitBuffer; @@ -258,7 +258,13 @@ public final class QrCode { // Indicates function modules that are not subjected to masking. Discarded when constructor finishes. private boolean[][] isFunction; + public void setModules(int size) { + this.modules = new boolean [size][size]; + } + public void setIsFunction(int size) { + this.isFunction = new boolean [size][size]; + } /*---- Constructor (low level) ----*/ @@ -581,9 +587,7 @@ public final class QrCode { // the same mask value a second time will undo the mask. A final well-formed // QR Code needs exactly one (not zero, two, etc.) mask applied. - private void applyMask(int msk) { - - + public void applyMask(int msk) { if (msk < 0 || msk > 7) throw new IllegalArgumentException("Mask value out of range"); for (int y = 0; y < size; y++) { @@ -593,7 +597,7 @@ public final class QrCode { Command mskCommand = MskCommandFactory.getCommand(msk); Button button = new Button(mskCommand); invert = button.pressed(y, x, msk); - + modules[y][x] ^= invert & !isFunction[y][x]; } } @@ -612,7 +616,10 @@ public final class QrCode { drawFormatBits(mask); // Overwrite old format bits return mask; // The caller shall assign this value to the final-declared field } - + + public int executeHandleConstructorMasking(int mask) { + return handleConstructorMasking(mask); + } // Automatically choose best mask private int findBestMask() { @@ -749,7 +756,11 @@ public final class QrCode { assert 208 <= result && result <= 29648; return result; } - + + public int excuteGetNumRawDataModules(int ver) { + return getNumRawDataModules(ver); + } + private static int calculateNumOfModules(int ver) { int size = ver * 4 + 17; int result = size * size; // Number of modules in the whole QR Code square @@ -794,7 +805,9 @@ public final class QrCode { return result; } - + public byte[] executeReedSolomonComputeDivisor(int degree) { + return reedSolomonComputeDivisor(degree); + } // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials. private static byte[] reedSolomonComputeRemainder(byte[] data, byte[] divisor) { Objects.requireNonNull(data); diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrCodeTest.java b/java/src/main/java/io/nayuki/qrcodegen/QrCodeTest.java new file mode 100644 index 0000000..db40c4b --- /dev/null +++ b/java/src/main/java/io/nayuki/qrcodegen/QrCodeTest.java @@ -0,0 +1,165 @@ +package io.nayuki.qrcodegen; + +import static org.junit.Assert.*; +import org.junit.*; + +public class QrCodeTest { + + @Test + public void testFactory() { + Command mskCommand0 = MskCommandFactory.getCommand(0); + Button button0 = new Button(mskCommand0); + assertEquals(true, button0.pressed(0, 2, 1)); + + Command mskCommand1 = MskCommandFactory.getCommand(1); + Button button1 = new Button(mskCommand1); + assertEquals(true, button1.pressed(0, 2, 1)); + + Command mskCommand2 = MskCommandFactory.getCommand(2); + Button button2 = new Button(mskCommand2); + assertEquals(true, button2.pressed(0, 3, 1)); + + Command mskCommand3 = MskCommandFactory.getCommand(3); + Button button3 = new Button(mskCommand3); + assertEquals(true, button3.pressed(1, 2, 1)); + + Command mskCommand4 = MskCommandFactory.getCommand(4); + Button button4 = new Button(mskCommand4); + assertEquals(true, button4.pressed(0, 2, 1)); + + Command mskCommand5 = MskCommandFactory.getCommand(5); + Button button5 = new Button(mskCommand5); + assertEquals(true, button5.pressed(0, 2, 1)); + + Command mskCommand6 = MskCommandFactory.getCommand(6); + Button button6 = new Button(mskCommand6); + assertEquals(true, button6.pressed(0, 2, 1)); + + Command mskCommand7 = MskCommandFactory.getCommand(7); + Button button7 = new Button(mskCommand7); + assertEquals(true, button7.pressed(0, 4, 1)); + } + + @Test(expected = AssertionError.class) + public void testAssertionError() { + + Command mskCommand = MskCommandFactory.getCommand(9); + + } + + @Test + public void testApplyMask() { + Ecc errCorLvl = Ecc.LOW; + Ecc errCorLv2 = Ecc.MEDIUM; + Ecc errCorLv3 = Ecc.QUARTILE; + Ecc errCorLv4 = Ecc.HIGH; + + int version1 = 1; + int version2 = 2; + int version3 = 39; + int version4 = 40; + + int size1 = version1 * 4 + 17; + int size2 = version2 * 4 + 17; + int size3 = version3 * 4 + 17; + int size4 = version4 * 4 + 17; + + String text = "Hello, world!"; + + QrCode qrcodeLOW = QrCode.encodeText(text, errCorLvl); + QrCode qrcodeMEDIUM = QrCode.encodeText(text, errCorLv2); + QrCode qrcodeQUARTILE = QrCode.encodeText(text, errCorLv3); + QrCode qrcodeHIGH = QrCode.encodeText(text, errCorLv4); + + qrcodeLOW.excuteGetNumRawDataModules(version1); + qrcodeMEDIUM.excuteGetNumRawDataModules(version2); + qrcodeQUARTILE.excuteGetNumRawDataModules(version3); + qrcodeHIGH.excuteGetNumRawDataModules(version4); + + qrcodeLOW.executeReedSolomonComputeDivisor(1); + qrcodeMEDIUM.executeReedSolomonComputeDivisor(2); + qrcodeQUARTILE.executeReedSolomonComputeDivisor(254); + qrcodeHIGH.executeReedSolomonComputeDivisor(255); + + qrcodeLOW.setModules(size1); + qrcodeLOW.setIsFunction(size1); + qrcodeMEDIUM.setModules(size2); + qrcodeMEDIUM.setIsFunction(size2); + qrcodeQUARTILE.setModules(size3); + qrcodeQUARTILE.setIsFunction(size3); + qrcodeHIGH.setModules(size4); + qrcodeHIGH.setIsFunction(size4); + + qrcodeLOW.applyMask(0); + qrcodeMEDIUM.applyMask(1); + qrcodeQUARTILE.applyMask(6); + qrcodeHIGH.applyMask(7); + + } + + @Test(expected = IllegalArgumentException.class) + public void testIllegalArgumentException_applyMask_MAXBound() { + + Ecc errCorLvl = Ecc.LOW; + String text = "Hello, world!"; + + QrCode qrcodeLOW = QrCode.encodeText(text, errCorLvl); + qrcodeLOW.applyMask(8); + + } + + @Test(expected = IllegalArgumentException.class) + public void testIllegalArgumentException_applyMask_MINBouond() { + + Ecc errCorLvl = Ecc.LOW; + String text = "Hello, world!"; + + QrCode qrcodeLOW = QrCode.encodeText(text, errCorLvl); + qrcodeLOW.applyMask(-1); + + } + + @Test(expected = IllegalArgumentException.class) + public void testIllegalArgumentException_getNumRawDataModules_MINBound() { + + Ecc errCorLvl = Ecc.LOW; + String text = "Hello, world!"; + + QrCode qrcodeLOW = QrCode.encodeText(text, errCorLvl); + qrcodeLOW.excuteGetNumRawDataModules(0); + + } + + @Test(expected = IllegalArgumentException.class) + public void testIllegalArgumentException_getNumRawDataModules_MAXBound() { + + Ecc errCorLvl = Ecc.LOW; + String text = "Hello, world!"; + + QrCode qrcodeLOW = QrCode.encodeText(text, errCorLvl); + qrcodeLOW.excuteGetNumRawDataModules(41); + + } + + @Test(expected = IllegalArgumentException.class) + public void testIllegalArgumentException_ReedSolomonComputeDivisor_MINBound() { + + Ecc errCorLvl = Ecc.LOW; + String text = "Hello, world!"; + + QrCode qrcodeLOW = QrCode.encodeText(text, errCorLvl); + qrcodeLOW.executeReedSolomonComputeDivisor(0); + + } + + @Test(expected = IllegalArgumentException.class) + public void testIllegalArgumentException_ReedSolomonComputeDivisor_MAXBound() { + + Ecc errCorLvl = Ecc.LOW; + String text = "Hello, world!"; + + QrCode qrcodeLOW = QrCode.encodeText(text, errCorLvl); + qrcodeLOW.executeReedSolomonComputeDivisor(256); + + } +} \ No newline at end of file diff --git a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java index 307f549..ff2d444 100644 --- a/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java +++ b/java/src/main/java/io/nayuki/qrcodegen/QrSegment.java @@ -29,7 +29,6 @@ import java.util.List; import java.util.Objects; import java.util.regex.Pattern; -import QrSegment.Mode; /** @@ -145,7 +144,7 @@ public final class QrSegment { /** The length of this segment's unencoded data. Measured in characters for * numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode. * Always zero or positive. Not the same as the data's bit length. */ - public final int numChars; + public final int numberOfCharacters; // The data bits of this segment. Not null. Accessed through getData(). final BitBuffer data;