From 3c70a488dd2fafda5e5277a74032cebd4d67a831 Mon Sep 17 00:00:00 2001 From: srowen Date: Wed, 30 Jul 2008 23:01:37 +0000 Subject: [PATCH] Re-add ECI test case and groundwork for more tests of DecodedBitStreamParser git-svn-id: http://zxing.googlecode.com/svn/trunk@539 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../google/zxing/common/BitSourceBuilder.java | 65 +++++++++++++++++++ .../DecodedBitStreamParserTestCase.java | 56 ++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100755 core/test/src/com/google/zxing/common/BitSourceBuilder.java create mode 100644 core/test/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParserTestCase.java diff --git a/core/test/src/com/google/zxing/common/BitSourceBuilder.java b/core/test/src/com/google/zxing/common/BitSourceBuilder.java new file mode 100755 index 00000000..a5bdeea4 --- /dev/null +++ b/core/test/src/com/google/zxing/common/BitSourceBuilder.java @@ -0,0 +1,65 @@ +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.common; + +import java.io.ByteArrayOutputStream; + +/** + * Class that lets one easily build an array of bytes by appending bits at a time. + * + * @author srowen@google.com (Sean Owen) + */ +public final class BitSourceBuilder { + + private final ByteArrayOutputStream output; + private int nextByte; + private int bitsLeftInNextByte; + + public BitSourceBuilder() { + output = new ByteArrayOutputStream(); + nextByte = 0; + bitsLeftInNextByte = 8; + } + + public void write(int value, int numBits) { + if (numBits <= bitsLeftInNextByte) { + nextByte <<= numBits; + nextByte |= value; + bitsLeftInNextByte -= numBits; + if (bitsLeftInNextByte == 0) { + output.write(nextByte); + nextByte = 0; + bitsLeftInNextByte = 8; + } + } else { + int bitsToWriteNow = bitsLeftInNextByte; + int numRestOfBits = numBits - bitsToWriteNow; + int mask = 0xFF >> (8 - bitsToWriteNow); + int valueToWriteNow = (value >>> numRestOfBits) & mask; + write(valueToWriteNow, bitsToWriteNow); + write(value, numRestOfBits); + } + } + + public byte[] toByteArray() { + if (bitsLeftInNextByte < 8) { + write(0, bitsLeftInNextByte); + } + return output.toByteArray(); + } + +} \ No newline at end of file diff --git a/core/test/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParserTestCase.java b/core/test/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParserTestCase.java new file mode 100644 index 00000000..126e188e --- /dev/null +++ b/core/test/src/com/google/zxing/qrcode/decoder/DecodedBitStreamParserTestCase.java @@ -0,0 +1,56 @@ +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.qrcode.decoder; + +import com.google.zxing.ReaderException; +import com.google.zxing.common.BitSourceBuilder; +import junit.framework.TestCase; + +/** + * Tests {@link com.google.zxing.qrcode.decoder.DecodedBitStreamParser}. + * + * @author srowen@google.com (Sean Owen) + */ +public final class DecodedBitStreamParserTestCase extends TestCase { + + public void testSimpleByteMode() throws ReaderException { + BitSourceBuilder builder = new BitSourceBuilder(); + builder.write(0x04, 4); // Byte mode + builder.write(0x03, 8); // 3 bytes + builder.write(0xA1, 8); + builder.write(0xA2, 8); + builder.write(0xA3, 8); + String result = DecodedBitStreamParser.decode(builder.toByteArray(), Version.getVersionForNumber(1)); + assertEquals("¡¢£", result); + } + + public void testECI() throws ReaderException { + BitSourceBuilder builder = new BitSourceBuilder(); + builder.write(0x07, 4); // ECI mode + builder.write(0x02, 8); // ECI 2 = CP437 encoding + builder.write(0x04, 4); // Byte mode + builder.write(0x03, 8); // 3 bytes + builder.write(0xA1, 8); + builder.write(0xA2, 8); + builder.write(0xA3, 8); + String result = DecodedBitStreamParser.decode(builder.toByteArray(), Version.getVersionForNumber(1)); + assertEquals("íóú", result); + } + + // TODO definitely need more tests here + +} \ No newline at end of file -- 2.20.1