blob: fdf8110c8dbf397539edd736c3a95cad66c34d86 [file] [log] [blame] [edit]
/*
* Copyright 2013 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.
*/
#import "ZXHighLevelEncodeTestCase.h"
static NSArray *TEST_SYMBOLS;
@implementation ZXHighLevelEncodeTestCase
+ (void)initialize {
TEST_SYMBOLS = @[[[ZXSymbolInfo alloc] initWithRectangular:NO dataCapacity:3 errorCodewords:5 matrixWidth:8 matrixHeight:8 dataRegions:1],
[[ZXSymbolInfo alloc] initWithRectangular:NO dataCapacity:5 errorCodewords:7 matrixWidth:10 matrixHeight:10 dataRegions:1],
/*rect*/[[ZXSymbolInfo alloc] initWithRectangular:YES dataCapacity:5 errorCodewords:7 matrixWidth:16 matrixHeight:6 dataRegions:1],
[[ZXSymbolInfo alloc] initWithRectangular:NO dataCapacity:8 errorCodewords:10 matrixWidth:12 matrixHeight:12 dataRegions:1],
/*rect*/[[ZXSymbolInfo alloc] initWithRectangular:YES dataCapacity:10 errorCodewords:11 matrixWidth:14 matrixHeight:6 dataRegions:2],
[[ZXSymbolInfo alloc] initWithRectangular:NO dataCapacity:13 errorCodewords:0 matrixWidth:0 matrixHeight:0 dataRegions:1],
[[ZXSymbolInfo alloc] initWithRectangular:NO dataCapacity:77 errorCodewords:0 matrixWidth:0 matrixHeight:0 dataRegions:1]];
//The last entries are fake entries to test special conditions with C40 encoding
}
- (void)useTestSymbols {
[ZXSymbolInfo overrideSymbolSet:TEST_SYMBOLS];
}
- (void)resetSymbols {
[ZXSymbolInfo overrideSymbolSet:[ZXSymbolInfo prodSymbols]];
}
- (void)testASCIIEncodation {
NSString *visualized = [self encodeHighLevel:@"123456"];
STAssertEqualObjects(visualized, @"142 164 186", @"");
visualized = [self encodeHighLevel:@"123456£"];
STAssertEqualObjects(visualized, @"142 164 186 235 36", @"");
visualized = [self encodeHighLevel:@"30Q324343430794<OQQ"];
STAssertEqualObjects(visualized, @"160 82 162 173 173 173 137 224 61 80 82 82", @"");
}
- (void)testC40EncodationBasic1 {
NSString *visualized = [self encodeHighLevel:@"AIMAIMAIM"];
STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 254", @"");
//230 shifts to C40 encodation, 254 unlatches, "else" case
}
- (void)testC40EncodationBasic2 {
NSString *visualized = [self encodeHighLevel:@"AIMAIAB"];
STAssertEqualObjects(visualized, @"230 91 11 90 255 254 67 129", @"");
//"B" is normally encoded as "15" (one C40 value)
//"else" case: "B" is encoded as ASCII
visualized = [self encodeHighLevel:@"AIMAIAb"];
STAssertEqualObjects(visualized, @"66 74 78 66 74 66 99 129", @""); //Encoded as ASCII
//Alternative solution:
//STAssertEqualObjects(visualized, @"230 91 11 90 255 254 99 129", @"");
//"b" is normally encoded as "Shift 3, 2" (two C40 values)
//"else" case: "b" is encoded as ASCII
visualized = [self encodeHighLevel:@"AIMAIMAIMË"];
STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 254 235 76", @"");
//Alternative solution:
//STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 11 9 254", @"");
//Expl: 230 = shift to C40, "91 11" = "AIM",
//"11 9" = "�" = "Shift 2, UpperShift, <char>
//"else" case
visualized = [self encodeHighLevel:@"AIMAIMAIMë"];
STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 254 235 108", @""); //Activate when additional rectangulars are available
//Expl: 230 = shift to C40, "91 11" = "AIM",
//"�" in C40 encodes to: 1 30 2 11 which doesn't fit into a triplet
//"10 243" =
//254 = unlatch, 235 = Upper Shift, 108 = � = 0xEB/235 - 128 + 1
//"else" case
}
- (void)testC40EncodationSpecExample {
//Example in Figure 1 in the spec
NSString *visualized = [self encodeHighLevel:@"A1B2C3D4E5F6G7H8I9J0K1L2"];
STAssertEqualObjects(visualized, @"230 88 88 40 8 107 147 59 67 126 206 78 126 144 121 35 47 254", @"");
}
- (void)testC40EncodationSpecialCases1 {
//Special tests avoiding ultra-long test strings because these tests are only used
//with the 16x48 symbol (47 data codewords)
[self useTestSymbols];
NSString *visualized = [self encodeHighLevel:@"AIMAIMAIMAIMAIMAIM"];
STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 91 11 91 11 91 11", @"");
//case "a": Unlatch is not required
visualized = [self encodeHighLevel:@"AIMAIMAIMAIMAIMAI"];
STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 91 11 91 11 90 241", @"");
//case "b": Add trailing shift 0 and Unlatch is not required
visualized = [self encodeHighLevel:@"AIMAIMAIMAIMAIMA"];
STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 91 11 91 11 254 66", @"");
//case "c": Unlatch and write last character in ASCII
[self resetSymbols];
visualized = [self encodeHighLevel:@"AIMAIMAIMAIMAIMAI"];
STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 91 11 91 11 254 66 74 129 237", @"");
visualized = [self encodeHighLevel:@"AIMAIMAIMA"];
STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 66", @"");
//case "d": Skip Unlatch and write last character in ASCII
}
- (void)testC40EncodationSpecialCases2 {
NSString *visualized = [self encodeHighLevel:@"AIMAIMAIMAIMAIMAIMAI"];
STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 91 11 91 11 91 11 254 66 74", @"");
//available > 2, rest = 2 --> unlatch and encode as ASCII
}
- (void)testTextEncodation {
NSString *visualized = [self encodeHighLevel:@"aimaimaim"];
STAssertEqualObjects(visualized, @"239 91 11 91 11 91 11 254", @"");
//239 shifts to Text encodation, 254 unlatches
visualized = [self encodeHighLevel:@"aimaimaim'"];
STAssertEqualObjects(visualized, @"239 91 11 91 11 91 11 254 40 129", @"");
//assertEquals("239 91 11 91 11 91 11 7 49 254", visualized);
//This is an alternative, but doesn't strictly follow the rules in the spec.
visualized = [self encodeHighLevel:@"aimaimaIm"];
STAssertEqualObjects(visualized, @"239 91 11 91 11 87 218 110", @"");
visualized = [self encodeHighLevel:@"aimaimaimB"];
STAssertEqualObjects(visualized, @"239 91 11 91 11 91 11 254 67 129", @"");
visualized = [self encodeHighLevel:[NSString stringWithFormat:@"aimaimaim{txt}%c", (char)0x0004]];
STAssertEqualObjects(visualized, @"239 91 11 91 11 91 11 16 218 236 107 181 69 254 129 237", @"");
}
- (void)testX12Encodation {
//238 shifts to X12 encodation, 254 unlatches
NSString *visualized = [self encodeHighLevel:@"ABC>ABC123>AB"];
STAssertEqualObjects(visualized, @"238 89 233 14 192 100 207 44 31 67", @"");
visualized = [self encodeHighLevel:@"ABC>ABC123>ABC"];
STAssertEqualObjects(visualized, @"238 89 233 14 192 100 207 44 31 254 67 68", @"");
visualized = [self encodeHighLevel:@"ABC>ABC123>ABCD"];
STAssertEqualObjects(visualized, @"238 89 233 14 192 100 207 44 31 96 82 254", @"");
visualized = [self encodeHighLevel:@"ABC>ABC123>ABCDE"];
STAssertEqualObjects(visualized, @"238 89 233 14 192 100 207 44 31 96 82 70", @"");
visualized = [self encodeHighLevel:@"ABC>ABC123>ABCDEF"];
STAssertEqualObjects(visualized, @"238 89 233 14 192 100 207 44 31 96 82 254 70 71 129 237", @"");
}
- (void)testEDIFACTEncodation {
//240 shifts to EDIFACT encodation
NSString *visualized = [self encodeHighLevel:@".A.C1.3.DATA.123DATA.123DATA"];
STAssertEqualObjects(visualized, @"240 184 27 131 198 236 238 16 21 1 187 28 179 16 21 1 187 28 179 16 21 1", @"");
visualized = [self encodeHighLevel:@".A.C1.3.X.X2.."];
STAssertEqualObjects(visualized, @"240 184 27 131 198 236 238 98 230 50 47 47", @"");
visualized = [self encodeHighLevel:@".A.C1.3.X.X2."];
STAssertEqualObjects(visualized, @"240 184 27 131 198 236 238 98 230 50 47 129", @"");
visualized = [self encodeHighLevel:@".A.C1.3.X.X2"];
STAssertEqualObjects(visualized, @"240 184 27 131 198 236 238 98 230 50", @"");
visualized = [self encodeHighLevel:@".A.C1.3.X.X"];
STAssertEqualObjects(visualized, @"240 184 27 131 198 236 238 98 230 31", @"");
visualized = [self encodeHighLevel:@".A.C1.3.X."];
STAssertEqualObjects(visualized, @"240 184 27 131 198 236 238 98 231 192", @"");
visualized = [self encodeHighLevel:@".A.C1.3.X"];
STAssertEqualObjects(visualized, @"240 184 27 131 198 236 238 89", @"");
//Checking temporary unlatch from EDIFACT
visualized = [self encodeHighLevel:@".XXX.XXX.XXX.XXX.XXX.XXX.üXX.XXX.XXX.XXX.XXX.XXX.XXX"];
STAssertEqualObjects(visualized, @"240 185 134 24 185 134 24 185 134 24 185 134 24 185 134 24 185 134 24"
@" 124 47 235 125 240" //<-- this is the temporary unlatch
@" 97 139 152 97 139 152 97 139 152 97 139 152 97 139 152 97 139 152 89 89",
@"");
}
- (void)testBase256Encodation {
//231 shifts to Base256 encodation
NSString *visualized = [self encodeHighLevel:@"\u00ABäöüé\u00BB"];
STAssertEqualObjects(visualized, @"231 44 108 59 226 126 1 104", @"");
visualized = [self encodeHighLevel:@"\u00ABäöüéà\u00BB"];
STAssertEqualObjects(visualized, @"231 51 108 59 226 126 1 141 254 129", @"");
visualized = [self encodeHighLevel:@"\u00ABäöüéàá\u00BB"];
STAssertEqualObjects(visualized, @"231 44 108 59 226 126 1 141 36 147", @"");
visualized = [self encodeHighLevel:@" 23£"]; //ASCII only (for reference)
STAssertEqualObjects(visualized, @"33 153 235 36 129", @"");
visualized = [self encodeHighLevel:@"\u00ABäöüé\u00BB 234"]; //Mixed Base256 + ASCII
STAssertEqualObjects(visualized, @"231 51 108 59 226 126 1 104 99 153 53 129", @"");
visualized = [self encodeHighLevel:@"\u00ABäöüé\u00BB 23£ 1234567890123456789"];
STAssertEqualObjects(visualized, @"231 55 108 59 226 126 1 104 99 10 161 167 185 142 164 186 208"
@" 220 142 164 186 208 58 129 59 209 104 254 150 45", @"");
visualized = [self encodeHighLevel:[self createBinaryMessage:20]];
STAssertEqualObjects(visualized, @"231 44 108 59 226 126 1 141 36 5 37 187 80 230 123 17 166 60 210 103 253 150", @"");
visualized = [self encodeHighLevel:[self createBinaryMessage:19]]; //padding necessary at the end
STAssertEqualObjects(visualized, @"231 63 108 59 226 126 1 141 36 5 37 187 80 230 123 17 166 60 210 103 1 129", @"");
visualized = [self encodeHighLevel:[self createBinaryMessage:276]];
STAssertTrue([visualized hasPrefix:@"231 38 219 2 208 120 20 150 35"], @"");
STAssertTrue([visualized hasSuffix:@"146 40 194 129"], @"");
visualized = [self encodeHighLevel:[self createBinaryMessage:277]];
STAssertTrue([visualized hasPrefix:@"231 38 220 2 208 120 20 150 35"], @"");
STAssertTrue([visualized hasSuffix:@"146 40 190 87"], @"");
}
- (NSString *)createBinaryMessage:(int)len {
NSMutableString *sb = [NSMutableString string];
[sb appendString:@"\u00ABäöüéàá-"];
for (int i = 0; i < len - 9; i++) {
[sb appendFormat:@"%C", (unichar)0x00B7];
}
[sb appendString:@"\u00BB"];
return [NSString stringWithString:sb];
}
- (void)testUnlatchingFromC40 {
NSString *visualized = [self encodeHighLevel:@"AIMAIMAIMAIMaimaimaim"];
STAssertEqualObjects(visualized, @"230 91 11 91 11 91 11 254 66 74 78 239 91 11 91 11 91 11", @"");
}
- (void)testUnlatchingFromText {
NSString *visualized = [self encodeHighLevel:@"aimaimaimaim12345678"];
STAssertEqualObjects(visualized, @"239 91 11 91 11 91 11 91 11 254 142 164 186 208 129 237", @"");
}
- (void)testHelloWorld {
NSString *visualized = [self encodeHighLevel:@"Hello World!"];
STAssertEqualObjects(visualized, @"73 239 116 130 175 123 148 64 158 233 254 34", @"");
}
- (void)testBug1664266 {
//There was an exception and the encoder did not handle the unlatching from
//EDIFACT encoding correctly
NSString *visualized = [self encodeHighLevel:@"CREX-TAN:h"];
STAssertEqualObjects(visualized, @"240 13 33 88 181 64 78 124 59 105", @"");
visualized = [self encodeHighLevel:@"CREX-TAN:hh"];
STAssertEqualObjects(visualized, @"240 13 33 88 181 64 78 124 59 105 105 129", @"");
visualized = [self encodeHighLevel:@"CREX-TAN:hhh"];
STAssertEqualObjects(visualized, @"240 13 33 88 181 64 78 124 59 105 105 105", @"");
}
- (void)testBug3048549 {
//There was an IllegalArgumentException for an illegal character here because
//of an encoding problem of the character 0x0060 in Java source code.
NSString *visualized = [self encodeHighLevel:@"fiykmj*Rh2`,e6"];
STAssertEqualObjects(visualized, @"239 122 87 154 40 7 171 115 207 12 130 71 155 254 129 237", @"");
}
- (void)testMacroCharacters {
NSString *visualized = [self encodeHighLevel:[NSString stringWithFormat:@"[)>%C05%C5555%C6666%C%C",
(unichar)0x001E, (unichar)0x001D, (unichar)0x001C,
(unichar)0x001E, (unichar)0x0004]];
//STAssertEqualObjects(visualized, @"92 42 63 31 135 30 185 185 29 196 196 31 5 129 87 237", @"");
STAssertEqualObjects(visualized, @"236 185 185 29 196 196 129 56", @"");
}
- (NSString *)encodeHighLevel:(NSString *)msg {
NSString *encoded = [ZXHighLevelEncoder encodeHighLevel:msg];
//[ZXDecodeHighLevel decode:encoded];
return [[self class] visualize:encoded];
}
+ (NSString *)visualize:(NSString *)codewords {
NSMutableString *sb = [NSMutableString string];
for (int i = 0; i < codewords.length; i++) {
if (i > 0) {
[sb appendString:@" "];
}
[sb appendFormat:@"%d", [codewords characterAtIndex:i] & 0xFF];
}
return [NSString stringWithString:sb];
}
@end