1 58 package org.krysalis.barcode.impl; 59 60 import junit.framework.TestCase; 61 62 67 public class Code128EncoderTest extends TestCase { 68 69 public static final String [] CHAR_NAMES = 70 {"NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", "BS", "HT", 71 "LF", "VT", "FF", "CR", "SO", "SI", "DLE", "DC1", "DC2", "DC3", 72 "DC4", "NAK", "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "FS", "GS", 73 "RS", "US"}; 75 public Code128EncoderTest(String name) { 76 super(name); 77 } 78 79 private String visualizeChar(char c) { 80 if (c < 32) { 81 return "<" + CHAR_NAMES[c] + ">"; 82 } else if (c == 127) { 83 return "<DEL>"; 84 } else { 85 return new Character (c).toString(); 86 } 87 } 88 89 private void visualizeCodesetA(StringBuffer sb, int idx) { 90 if (idx < 64) { 91 sb.append(visualizeChar((char)(idx + 32))); 92 } else if ((idx >= 64) && (idx <= 95)) { 93 sb.append(visualizeChar((char)(idx - 64))); 94 } else if (idx == 96) { 95 sb.append("<FNC3>"); 96 } else if (idx == 97) { 97 sb.append("<FNC2>"); 98 } else if (idx == 101) { 99 sb.append("<FNC4>"); 100 } else if (idx == 102) { 101 sb.append("<FNC1>"); 102 } 103 } 104 105 private void visualizeCodesetB(StringBuffer sb, int idx) { 106 if (idx <= 95) { 107 sb.append(visualizeChar((char)(idx + 32))); 108 } else if (idx == 96) { 109 sb.append("<FNC3>"); 110 } else if (idx == 97) { 111 sb.append("<FNC2>"); 112 } else if (idx == 100) { 113 sb.append("<FNC4>"); 114 } else if (idx == 102) { 115 sb.append("<FNC1>"); 116 } 117 } 118 119 private void visualizeCodesetC(StringBuffer sb, int idx) { 120 if (idx < 100) { 121 sb.append("["); 122 sb.append(Integer.toString(idx)); 123 sb.append("]"); 124 } else if (idx == 102) { 125 sb.append("<FNC1>"); 126 } 127 } 128 129 private String visualize(int[] encodedMsg) { 130 StringBuffer sb = new StringBuffer (); 131 char codeset; 132 if (encodedMsg[0] == 103) { 133 codeset = 'A'; 134 } else if (encodedMsg[0] == 104) { 135 codeset = 'B'; 136 } else if (encodedMsg[0] == 105) { 137 codeset = 'C'; 138 } else { 139 throw new RuntimeException ("Invalid start character"); 140 } 141 sb.append("->" + codeset); 142 int pos = 1; 143 while (pos < encodedMsg.length) { 144 int idx = encodedMsg[pos]; 145 if (codeset == 'A') { 146 if (idx == 98) { 147 sb.append("<SHIFT-B>"); 148 pos++; 149 visualizeCodesetB(sb, encodedMsg[pos]); 150 } else if (idx == 99) { 151 codeset = 'C'; 152 sb.append("->" + codeset); 153 } else if (idx == 100) { 154 codeset = 'B'; 155 sb.append("->" + codeset); 156 } else { 157 visualizeCodesetA(sb, idx); 158 } 159 } else if (codeset == 'B') { 160 if (idx == 98) { 161 sb.append("<SHIFT-A>"); 162 pos++; 163 visualizeCodesetA(sb, encodedMsg[pos]); 164 } else if (idx == 99) { 165 codeset = 'C'; 166 sb.append("->" + codeset); 167 } else if (idx == 101) { 168 codeset = 'A'; 169 sb.append("->" + codeset); 170 } else { 171 visualizeCodesetB(sb, idx); 172 } 173 } else if (codeset == 'C') { 174 if (idx == 100) { 175 codeset = 'B'; 176 sb.append("->" + codeset); 177 } else if (idx == 101) { 178 codeset = 'A'; 179 sb.append("->" + codeset); 180 } else { 181 visualizeCodesetC(sb, idx); 182 } 183 } 184 pos++; 185 } 186 return sb.toString(); 187 } 188 189 private String encodeToDebug(String msg, Code128Encoder encoder) { 190 return visualize(encoder.encode(msg)); 191 } 192 193 198 199 public void testDefaultEncoder() throws Exception { 200 Code128Encoder encoder = new DefaultCode128Encoder(); 201 testEncoder(encoder); 202 testEncoderSpecialChars(encoder); 203 204 try { 205 encodeToDebug("before\u00f5after", encoder); 206 fail("Expected IllegalArgumentException because of illegal char 0xF5"); 207 } catch (IllegalArgumentException iae) { 208 } 210 } 211 212 private void testEncoderSpecialChars(Code128Encoder encoder) { 213 assertEquals("->BCode<SHIFT-A><HT>128", encodeToDebug("Code\t128", encoder)); 214 assertEquals("->BCode->A<HT><HT>128", encodeToDebug("Code\t\t128", encoder)); 215 assertEquals("->C<FNC1>[12][34][56]", encodeToDebug("\u00f1123456", encoder)); 216 assertEquals("->B<FNC2>->C[12][34][56]", encodeToDebug("\u00f2123456", encoder)); 217 assertEquals("->Bbefore<FNC3>after", encodeToDebug("before\u00f3after", encoder)); 218 assertEquals("->Bbefore<FNC4>after<DEL>", 219 encodeToDebug("before\u00f4after\u007f", encoder)); 220 } 221 222 private void testEncoder(Code128Encoder encoder) throws Exception { 223 assertEquals("->B1", encodeToDebug("1", encoder)); 224 assertEquals("->C[12]", encodeToDebug("12", encoder)); 225 assertEquals("->B123", encodeToDebug("123", encoder)); 226 assertEquals("->C[12][34]", encodeToDebug("1234", encoder)); 227 assertEquals("->C[12][34]->B5", encodeToDebug("12345", encoder)); 228 assertEquals("->C[12][34][56]", encodeToDebug("123456", encoder)); 229 230 assertEquals("->B1Code", encodeToDebug("1Code", encoder)); 231 assertEquals("->B12Code", encodeToDebug("12Code", encoder)); 232 assertEquals("->B123Code", encodeToDebug("123Code", encoder)); 233 assertEquals("->C[12][34]->BCode", encodeToDebug("1234Code", encoder)); 234 assertEquals("->C[12][34]->B5Code", encodeToDebug("12345Code", encoder)); 235 assertEquals("->C[12][34][56]->BCode", encodeToDebug("123456Code", encoder)); 236 237 assertEquals("->BCode128", encodeToDebug("Code128", encoder)); 238 assertEquals("->BCode128", encodeToDebug("Code128", encoder)); 239 assertEquals("->BCode->C[56][78]->Ba", encodeToDebug("Code5678a", encoder)); 240 String res = encodeToDebug("Code56789a", encoder); 241 assertTrue(res.equals("->BCode->C[56][78]->B9a") 242 || res.equals("->BCode5->C[67][89]->Ba") 243 || res.equals("->BCode5->C[67][89]<SHIFT-B>a")); 244 assertEquals("->BCode->C[56][78][90]->Bab", encodeToDebug("Code567890ab", encoder)); 245 assertEquals("->BCode5->C[67][89]", encodeToDebug("Code56789", encoder)); 246 } 247 248 } | Popular Tags |