/*
 * 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
